2

一直试图让这样的东西工作一段时间,下面似乎没有将正确的 arg 发送到 c 程序 arg_count,它输出argc = 1. 当我很确定我想要它时2./arg_count -arg从外壳输出 2...

我尝试过使用另一个 arg(所以它会在 shell 中输出 3),并且在通过子进程调用时它仍然输出 1。

import subprocess
pipe = subprocess.Popen(["./args/Release/arg_count", "-arg"], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = pipe.communicate()
result = out.decode()
print "Result : ",result
print "Error : ",err

知道我在哪里摔倒了吗?我正在运行 linux 顺便说一句。

4

2 回答 2

5

文档中:

shell 参数(默认为 False)指定是否使用 shell 作为程序来执行。如果 shell 为 True,建议将 args 作为字符串而不是序列传递。

因此,

pipe = subprocess.Popen("./args/Release/arg_count -arg", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

应该给你你想要的。

于 2013-10-15T09:50:55.193 回答
2

如果shell=True那么你的电话相当于:

from subprocess import Popen, PIPE

proc = Popen(['/bin/sh', '-c', "./args/Release/arg_count", "-arg"],
             stdout=PIPE, stderr=PIPE)

即,-arg传递给外壳本身而不是您的程序。Dropshell=True传递-arg给程序:

proc = Popen(["./args/Release/arg_count", "-arg"],
             stdout=PIPE, stderr=PIPE)

如果您不需要stderr单独捕获,stdout则可以使用check_output()

from subprocess import check_output, STDOUT

output = check_output(["./args/Release/arg_count", "-arg"]) # or
output_and_errors = check_output(["./args/Release/arg_count", "-arg"],
                                 stderr=STDOUT)
于 2013-10-15T10:05:40.860 回答