我正在使用以下代码从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'
答案 0 :(得分:1)
进程及其子进程之间的唯一通道是管道,即简单的字节流。
C程序通过communicate
接收到空的stdin流,这与从空文件中读取相同。它从中读取10个值(什么也没找到),因此每个scanf
返回-1,并且不会更改rhs[i]
的原始值,而该值恰好是0.
。然后它将其标准输出通道上的值打印出来,如果是0.
格式,则为10 %f
的两倍。
Python脚本在其stdout
变量中接收该字节字符串。最初的b
只是stdout
是字节字符串而不是unicode字符串的标记。
如果这很重要,则无法在流程及其子流程之间传递复杂的对象:所有内容都必须由发送方以字节字符串序列化,并由接收方反序列化。 Python struct
模块特别擅长以可移植的方式序列化简单类型,以便可以在C中轻松地反序列化它们。