2013-10-15 78 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)