gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:39:17 25 4
gpt4 key购买 nike

我使用此代码从 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'

最佳答案

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

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

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

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

关于python - 从 python 调用 c 程序时将数组传递给子进程模块的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56157725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com