在python中获取C程序的输出

时间:2016-06-25 15:05:10

标签: python c subprocess popen

这是一个简单的问题,但我找不到任何问题,所以我在这里,我试图用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代码:

char* main(char* argc,char* argv[]){
char* r;
r = serialize(argv[1],atoi(argv[2]),atoi(argv[3]));
printf("%s", r);
return r;
}

(序列化是我制作的功能非常好,我知道因为返回之前的printf给了我想要的东西)。

所以,如果你有任何想法,那就感谢大家。

1 个答案:

答案 0 :(得分:-1)

这里有两个问题:

  • 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,请执行:

output = subprocess.check_output(command, stderr=subprocess.STDOUT)

您的C代码也不正确。 main应返回带有进程返回码的int(在本例中为0),您可以使用puts(r)代替printf。如果传递少于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;
}