用python获取C程序的输出

2024-04-26 10:16:23 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个简单的问题,但是我找不到任何与我的问题相关的东西,所以在这里,我试图用Python执行一个C程序来获得输出,问题是它不能工作。 我没有错误,但是当我试图打印输出时,我什么也没有得到,比如空白或者其他什么,但是如果我打印输出的内容(这是一个单词吗?)在我的C语言中,它工作得很好,所以下面是我的python代码:

command = "./serialize %s %s %s" %(binary , width , height)
p=subprocess.Popen(command, shell=True,stderr=subprocess.STDOUT)
(output, err) = p.communicate()
print output

(相当直接,二进制是一个字符串,宽度和高度是整数)

如果你想知道,这是我的C代码:

^{pr2}$

(serialize是我做的一个非常好用的函数,我知道这是因为在返回之前printf提供了我想要的)。在

如果你有什么好主意的话,谢谢大家。在


Tags: 代码程序内容output错误width单词serialize
1条回答
网友
1楼 · 发布于 2024-04-26 10:16:23

这里有两个问题:

  • Popen接受一个列表的参数,而不是一个字符串。当shell=True时传递该参数是一个严重的安全隐患。想象一下如果width等于; rm -rf /。在
  • 返回值是一个特殊的对象,它包含有关运行进程的信息。Popen不等待进程返回。在

尝试:

command = ['./serialize', binary, str(width), str(height)]
stdout, stderr = subprocess.check_output(command)
print stdout, stderr

如果要在一个字符串中同时使用stdout和stderr,请执行以下操作:

^{pr2}$

你的C代码也不正确。main应该返回一个int,并且可以使用puts(r)而不是{}。如果传递的参数少于3个,它也会严重崩溃。另外,argc也是int。尝试类似于:

int main(int argc, char** argv) {
    char* r;
    if (argc < 4) {
        puts("Too few arguments");
        return 1;
    }
    r = serialize(argv[1],atoi(argv[2]),atoi(argv[3]));
    puts(r);
    return 0;
}

相关问题 更多 >