2015-03-18 275 views
0

我試圖在我的python腳本中使用subprocess.Popen()順序執行幾個linux命令。但是,這似乎是我寫腳本的方式,python正在執行某種類型的執行並忘記,並且在開始步驟2之前不等待第1步完成。如何在python腳本中執行多個命令的命令

例如,我試圖:

  1. 執行SQL命令,將結果寫入遠程服務器的 /tmp中的文件。
  2. 當我完成使用該文件後,我想刪除遠程文件,所以我們沒有用完空間。

發生了什麼是python似乎運行第1步的cmd,並沒有等待第1步完成,它運行第2步。因此,該文件仍然掛起,因爲在創建文件之前運行刪除。

這是我的代碼片段。希望有人能告訴我如何做到這一點,所以第2步只在第1步完成後運行。我試圖匿名/簡化代碼片段,以便在匿名代碼時避免任何錯誤。

sqlCmd = "ssh " + HOST + "mysql -h host -ppwd -q select blah from table where foo = 'bar' INTO OUTFILE '/tmp/blah_bydate.csv" 
    rmCmd = "ssh " + HOST + " rm -f /tmp/blah_bydate.csv" 
    proc = subprocess.Popen(sqlCmd, shell=True, stdout=subprocess.PIPE) 
    proc = subprocess.Popen(rmCmd, shell=True, stdout=subprocess.PIPE) 

我發現一些上那麼,建議的解決辦法是做類似

subprocess.Popen([cmd1; cmd2; cmd3], shell=True, stdout=subprocess.PIPE) 

,我不想做,因爲我的命令,參數化和可長/複雜。

+0

考慮運行單個'ssh'會話... – 2015-03-18 22:50:09

+1

詳細說明@Karoly:在* nix中,如果有''ls; cp a.txt b.txt''''cp'將不會被執行,直到'ls'命令完成。而且,如果你使用''ls && cp a.txt b.txt'','cp'將不會被執行,除非'ls'成功完成。因此,建立一個統一的_Cmd_字符串,將你的'mysql'和'rm'命令與';'或'&&'連接起來。 – boardrider 2015-03-19 10:47:16

回答

2

只需使用subprocess.call而不是subprocess.Popen,它應該阻塞,直到過程結束。

+1

要牢記的另一件事是確保您清理'HOST',因爲您使用'shell = True'。文檔[此處]有警告(https://docs.python.org/2/library/subprocess.html#frequently-used-arguments)。 – 2015-03-18 22:49:50

+0

感謝您的警告。我讀過警告,但如果shell = False,該命令不起作用,並給出了另一個錯誤,所以我必須讓shell = True使每個人(我和python)開心=) – Classified 2015-03-18 23:02:21

+1

當然。關鍵是要確保你不讓不擇手段的互聯網人給你HOST的價值。 :P – 2015-03-18 23:04:42

2

如果您需要,可以使用proc.wait(),它甚至可以取超時值。