这是一个简单的问题,但我找不到任何问题,所以我在这里,我试图用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给了我想要的东西)。
所以,如果你有任何想法,那就感谢大家。
答案 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;
}