【问题标题】:Obtaining output of a C program in python在python中获取C程序的输出
【发布时间】:2016-10-28 01:00:54
【问题描述】:

这是一个简单的问题,但我在我的问题附近找不到任何东西,所以我开始了,我试图在 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 给了我想要的东西)。

所以,如果您有任何想法,那就太好了,谢谢大家。

【问题讨论】:

    标签: python c subprocess popen


    【解决方案1】:

    这里有两个问题:

    • Popen 采用 list 参数,而不是字符串。当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;
    }
    

    【讨论】:

    • 刚试过,但我得到了一个错误,这里是回溯: Traceback(最近一次调用最后一次):文件“testsql.py”,第 77 行,在 stdout,stderr = subprocess.check_output (命令)文件“/usr/lib/python2.7/subprocess.py”,第 567 行,在 check_output 进程 = Popen(stdout=PIPE, *popenargs, **kwargs) 文件“/usr/lib/python2.7/ subprocess.py”,第 711 行,在 init errread, errwrite) 文件“/usr/lib/python2.7/subprocess.py”,第 1340 行,在 _execute_child raise child_exception TypeError: execv() arg 2 必须只包含字符串
    • @DrunkenChoko widthheight 是整数吗?我相信是这样;我更新了答案。
    • 啊,好吧,新的一天,新的错误,返回非零退出状态 32,我会说这很丑。
    • @DrunkenChoko 您还需要将更改应用到我提到的 C 文件。
    • 有一个错误“to many value to unpack”,为了抑制它我像这样替换元组: output=subprocess.check_output(command,stderr=subprocess.STDOUT) 打印输出但现在我什么也没得到就像一开始一样
    猜你喜欢
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2023-04-05
    • 2011-11-18
    • 2014-03-25
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多