从python调用C程序时将数组传递给子进程模块的问题

时间:2019-05-15 21:15:18

标签: 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'

1 个答案:

答案 0 :(得分:1)

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

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

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

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