2012-11-22 21 views
4

我是Python新手。我遇到了以下問題。要傳遞`echo t | `作爲`subprocess.check_output`中的參數

我一直在使用subprocess.check_output從我的Python腳本調用一個exe。

res = subprocess.check_output(["svn.exe", "list", "Https://127.0.0.1:443/svn/Repos"], stderr=subprocess.STDOUT) 

當腳本在命令提示符下執行,我得到一個提示信息輸入的輸入,

(R)eject, accept (t)emporarily or accept (p)ermanently? 

但是,當我從一個批處理文件執行腳本,我沒有得到這個消息,默認情況下呼叫check_output失敗。
有沒有辦法在調用subprocess.check_output時通過輸入,以便我可以批量運行腳本。

嗨,我更新我的問題: 我試圖運行從命令提示符下使用svn用下面的命令,

echo t | svn.exe list Https://127.0.0.1:443/svn/Repos 

我沒有任何用戶輸入輸出。

但我想不出能順利通過echo t |subprocess.check_output。 有沒有辦法做到這一點?

請幫我解決這個問題。 謝謝

回答

0

,我發現我的問題兩種解決方案,

1.found這個soultion從這個鏈接http://desipenguin.com/techblog/2009/01/13/fun-with-python-subprocessstdin/

proc = subprocess.Popen((["svn.exe", "list", "Https://127.0.0.1:443/svn/Repos"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
print proc.communicate(‘t\n’)[0] 

這解析爲過程提供鍵輸入 'T'。但我無法讀取輸出。所以,我遵循第二個解決方案。

2,採用2級的子過程:

p = subprocess.Popen("echo t |", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
p1 = subprocess.Popen(["svn.exe", "list", "Https://127.0.0.1:443/svn/Repos"], shell=True, **stdin=p.stdout**, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 
output = p1[0] 

這裏過程1的輸出由下式給出過程2的輸入因此,這是等於echo t | svnmucc mkdir d:\temp

謝謝。

1

我想這不是標題問題的答案,但你試過svn--non-interactive --trust-server-cert?這不是你想要的嗎?

+0

嗨@邁克爾我嘗試添加'「--non互動」,「--trust服務器證書」',但我得到一個錯誤,_SERVER證書驗證failed_。所以,如果你能告訴我如何通過'(R)彈出輸入,接受(t)'或'永久接受'(p),這樣會有幫助,這樣我就可以讓svn接受證書。 – Arun

1

您收到的郵件與我的證書相關。因此,不要增加傳遞輸入到命令的複雜性,要​​麼修復證書問題,要麼將the --trust-server-cert flag傳遞給SVN命令。

res = subprocess.check_output(["svn.exe", "--trust-server-cert", "list", "url"], stderr=subprocess.STDOUT) 
+0

是的,該消息與證書有關。即使我添加'「--trust-server-cert」',我會得到一個錯誤,說明_Server證書驗證失敗。所以如果你可以告訴我如何通過輸入,這樣我就可以讓svn接受證書,這會很有幫助。 – Arun