python - 从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'
解决方案
进程与其子进程之间的唯一通道是管道,即简单的字节流。
C 程序通过 接收一个空的标准输入流communicate
,这与从一个空文件中读取是一样的。它从中读取 10 个值(并且什么也没找到),因此每个都scanf
返回 -1 并且不会更改rhs[i]
恰好是的原始值0.
。然后它在其标准输出通道上打印,如果格式为 100.
双精度值。%f
Python 脚本在其stdout
变量中接收该字节字符串。首字母b
只是stdout
一个字节字符串而不是 unicode 字符串的标记。
如果这很重要,则无法在进程及其子进程之间传递复杂的对象:所有内容都必须由发送方以字节串序列化,并由接收方反序列化。Pythonstruct
模块特别擅长以可移植的方式序列化简单类型,以便它们可以在 C 中轻松反序列化。
推荐阅读
- javascript - 在开发模式下运行下一个 js 应用程序时打印到控制台的一些警告日志
- django - 当用户回复评论时,它会显示评论时间。它应该显示实际时间。我该如何解决?
- google-apps-script - Google Apps Scripts 和 Google Forms:这是“添加标题和描述”的 Class Form 方法
- regex - Filebeat 正则表达式 - 数字前的空格
- javascript - 带有变量的jQuery中的Concat选择器
- sas - 在 sas 9.3 和 9.4 之间使用文件名 sftp 是否存在语法差异?
- spring-boot - 修复客户端可以接收传入消息但无法发送传出心跳消息
- jasper-reports - Jasper - 从 JSON 数据源传递 GregorianCalendar
- rest - Wirecard 退款申请
- javascript - 查找所有以 id="string" 开头的 div,遍历结果并更改其 id