Как экспортировать массив C в Python

1

У меня есть файл .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?

Я не могу трогать эти файлы, потому что они принадлежат к внешней библиотеке, подлежащей модификации. Точно, я хочу иметь возможность обновлять библиотеку, не влияя на мой код.

  • 2
    Зависит от приложения: это единственная вещь, в которой вам нужно переместить эти числа в Python и сохранить их там, или вам нужен доступ к ним из кода C и т. Д. Просто конвертируйте текст из C в Python должно быть тривиально с небольшим скриптом Python. Доступ к ним во время выполнения другой червь.
  • 0
    Этот file.cc должен быть какой-то библиотекой C для использования программой на Python или независимой программой? В случае A вы можете проверить наличие ctypes , cython или написать небольшое расширение Python C; во втором случае вам просто нужно использовать какой-то IPC (точно так же, как если бы программа на python была другой программой на C).
Показать ещё 1 комментарий
Теги:
arrays
ctypes

2 ответа

1

Это в значительной степени ответило на эту другую публикацию 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

Отсюда я просто перебираю их в список.

  • 0
    Большой! спасибо Брайан. Это мне нужно;)
  • 0
    Приятно слышать. Если лучший ответ не появится, вы должны принять тот ответ, который работает для вас.
0

Как использовать временный файл? Поместите матрицу в нее на 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 " "
  • 0
    Это может сработать, однако я бы хотел сделать что-то более автоматическое с ctypes. Я пытался использовать h2xml.py и xml2py.py, но последний, похоже, не поддерживает инициализацию массива. Возвращается с ошибкой «Cannot initialize ArrayType».

Ещё вопросы

Сообщество Overcoder
Наверх
Меню