2013-10-15 45 views
0

一直试图让这样的工作一段时间,下面似乎并没有发送正确的参数给c程序arg_count,它输出argc = 1。当我很确定我希望它是2./arg_count -arg从壳输出2 ...python subprocess missing arguments

我试着用另一个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 btw。

回答

2

documentation

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

因此,

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

应该给你你想要的东西。

+0

谢谢,这似乎解决争论问题,但是现在我得不到任何输出...... – jayjay

+0

无论出于何种原因,脚本必须与可执行文件位于同一目录才能获得有效结果?或者我不知道如何写一个文件路径... – jayjay

+0

这不应该是这样;我可以很容易地将我的'arg_count'版本(在这种情况下是一个2行Python脚本)放在不同的目录中,并获得正确的结果。除非你的'arg_count'本身有一些尴尬的问题。 – Evert

1

如果shell=True那么你的调用等效于:

from subprocess import Popen, PIPE 

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

-arg传递到外壳本身,而不是你的程序。掉落shell=True传递-arg到程序:

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

如果你不需要从stdout分别捕捉stderr那么你可以使用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)