2014-06-12 16 views
0

我正在寫一個python腳本來添加一些功能到CVS存儲庫。我試圖使用subprocess.Popen模塊通過Windows命令行運行CVS檢出,例如,Subprocess.Popen與CVS資源庫的用法?

subprocess.Popen('cvs -Q co -r %tag% %directory%') 

其中標記和目錄只是佔位符(腳本需要用戶輸入)。我有CVSROOT集,但無論什麼原因,我無法獲得腳本檢出所需的CVS模塊。直接在命令行中運行相同的命令(在引號內)按預期工作,檢查目錄。

回答

1

好吧,如果你想相同的行爲在shell,你應該這麼說:

subprocess.Popen('cvs -Q co -r %tag% %directory%', shell=True) 

但一般不如做

subprocess.Popen(['cvs', '-Q', 'co', '-r', tag, directory]) 

代替。

+0

第二種辦法保護你的問題,如果,例如,目錄名中有空格(或更糟的是,字符像>; |)。在窗口上,Popen的實現將引用這些內容;在Linux上shell被繞過,所以這不是問題。 – greggo

+0

我已經嘗試了兩個,但仍然沒有骰子。第一種方法設置shell = True只是返回並且沒有打開命令提示符。第二種方法列出命令作爲字符串簡要地提出了一個命令提示符,但它立即關閉,我無法閱讀文本(即如果有錯誤消息),並沒有簽出模塊。這與我之前嘗試過的結果是一樣的。 – user2049004

+0

你可以打開cmd.exe並在那裏鍵入命令,並使其工作? – greggo

2

參數不作爲字符串傳遞給subprocess.Popen。你需要通過命令和參數列表中

subprocess.Popen(['cvs', '-Q', 'co', '-r', '%tag%', '%directory%']) 

或可替代

subprocess.Popen(shelex.split('cvs -Q co -r %tag% %directory%'))