【问题标题】:How to export a C array to Python如何将 C 数组导出到 Python
【发布时间】:2013-05-06 23:51:59
【问题描述】:

我有一个包含双精度值数组的 file.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 列表?

我无法触摸这些文件,因为它们属于外部库,可能会被修改。确切地说,我希望能够在不影响我的代码的情况下更新库。

【问题讨论】:

  • 取决于应用程序:这只是一次性的事情,您需要将这些数字移至 Python 并保留在那里,还是需要通过运行 C 代码等访问它们?只需使用一点 Python 脚本,只需将文本从 C 转换为 Python 就可以了。在运行时访问它们是另一回事。
  • 这个file.cc应该是python程序或独立程序使用的某种C库?如果是 A,您可以检查 ctypescython 或编写一个小的 python C 扩展;在第二种情况下,您只需使用某种 IPC(就像 python 程序是不同的 C 程序一样)。
  • 我无法触摸这些文件,因为它们属于外部库,可能会被修改。确切地说,我希望能够在不影响其余代码的情况下更新库。

标签: python c arrays ctypes


【解决方案1】:

这在this other SO post 中得到了很好的回答。

但我会在这里补充一点。您需要定义一个类型,然后使用in_dll 方法。

从你的例子中,我用values 中的这些值做了一个。我希望你知道它有多大,或者可以从库中的其他 var 中找出来,否则这是一个等待发生的 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

从这里我将遍历它们并读入一个列表。

【讨论】:

  • 很高兴听到。除非出现更好的答案,否则您应该接受适合您的答案。
【解决方案2】:

使用临时文件怎么样?用C把矩阵放进去,用python读取。

在file.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 脚本读取它们:

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 " "

【讨论】:

  • 它可以工作,但是我想用 ctypes 做一些更自动化的事情。我尝试使用 h2xml.py 和 xml2py.py 但最后一个似乎不支持初始化数组。它返回“无法初始化 ArrayType”错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 2020-12-06
  • 2015-03-23
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多