首页 > 解决方案 > 从python调用c程序时将数组传递给子进程模块的问题

问题描述

我正在使用此代码从 Python 调用 C 脚本:

subprocess.check_output(["./s_cg",str(10),str(bb)])

C脚本有代码:

int main(int argc, char *argv[])
{
int order;
int i,j;
order = atoi(argv[1]);

double* rhs = malloc(order * sizeof(double));
for (i = 0; i < order; i++) {
              scanf("%lf", &rhs[i])

          }


 for(i=0;i<order;i++)
  {
    printf("%lf",rhs[i]);
  }

    return 0;

}

传递的实际数组 bb 是:array([1., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

但是打印出来的数组是:

b'0.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000'

标签: pythonc

解决方案


进程与其子进程之间的唯一通道是管道,即简单的字节流。

C 程序通过 接收一个空的标准输入流communicate,这与从一个空文件中读取是一样的。它从中读取 10 个值(并且什么也没找到),因此每个都scanf返回 -1 并且不会更改rhs[i]恰好是的原始值0.。然后它在其标准输出通道上打印,如果格式为 100.双精度值。%f

Python 脚本在其stdout变量中接收该字节字符串。首字母b只是stdout一个字节字符串而不是 unicode 字符串的标记。

如果这很重要,则无法在进程及其子进程之间传递复杂的对象:所有内容都必须由发送方以字节串序列化,并由接收方反序列化。Pythonstruct模块特别擅长以可移植的方式序列化简单类型,以便它们可以在 C 中轻松反序列化。


推荐阅读