У меня есть файл .cc, который содержит массив значений удвоений, как показано здесь:
double values[][4] = {
{ 0.1234, +0.5678, 0.1222, 0.9683 },
{ 0.1631, +0.4678, 0.2122, 0.6643 },
{ 0.1332, +0.5678, 0.1322, 0.1683 },
{ 0.1636, +0.7678, 0.7122, 0.6283 }
... continue
}
Как экспортировать эти значения в список Python?
Я не могу трогать эти файлы, потому что они принадлежат к внешней библиотеке, подлежащей модификации. Точно, я хочу иметь возможность обновлять библиотеку, не влияя на мой код.
Это в значительной степени ответило на эту другую публикацию SO.
Но я немного добавлю. Вам нужно определить тип, а затем использовать метод in_dll
.
В вашем примере я сделал так с этими значениями в values
. Надеюсь, у вас есть идея, насколько она велика или может быть найдена из других vars в библиотеке, иначе это может произойти с ошибкой seg.
import ctypes
lib = ctypes.CDLL('so.so')
da = ctypes.c_double*4*4
da.in_dll(lib, "values")[0][0]
# 0.1234
da.in_dll(lib, "values")[0][1]
# 0.5678
da.in_dll(lib, "values")[0][2]
# 0.1222
Отсюда я просто перебираю их в список.
Как использовать временный файл? Поместите матрицу в нее на C и прочитайте их с помощью python.
В файле .cc, напишите функцию для сохранения матрицы в файл.
int save_to_file(double matrix[][4],int row) {
int i,j;
FILE *fp;
fp=fopen("tmp","w");
for(i=0;i<row;i++)
for(j=0;j<4;j++) {
fprintf(fp,"%f",matrix[i][j]);
if(j==3)
fprintf(fp,"\n",matrix[i][j]);
else
fprintf(fp," ",matrix[i][j]);
}
fclose(fp);
return 0;
}
и прочитайте их с помощью Python script следующим образом:
tmp=open('tmp')
L = []
for line in tmp:
newline = []
t = line.split(' ')
for string in t:
newline.append(float(string))
L.append(newline)
tmp.close()
for row in L:
for number in row:
print "%.4f" %number
print " "
file.cc
должен быть какой-то библиотекой C для использования программой на Python или независимой программой? В случае A вы можете проверить наличиеctypes
,cython
или написать небольшое расширение Python C; во втором случае вам просто нужно использовать какой-то IPC (точно так же, как если бы программа на python была другой программой на C).