2017-06-20 255 views
0

我想用popen啓動一個接一個地調用兩個命令(有多個參數)的子進程。第二個命令依賴於第一個命令的運行,所以我希望使用一個子進程來運行,而不是產生兩個進程,然後等待第一個命令。python subprocess popen同步命令

但我遇到了問題,因爲我不知道如何給出兩個命令輸入或將命令作爲一個單獨的對象進行分離。

此外,我試圖避免將shell設置爲true,如果可能的話。

這基本上,我試圖做的事:

for test in resources: 
    command = [ 
     'pgh', 
     'resource', 
     'create', 
     '--name', test['name'], 
     '--description', test['description'], 
    ] 
    command2 = [ 
     'pgh', 
     'assignment', 
     'create', 
     '--name', test['name'], 
     '--user', test['user'], 
    ] 


    p = Popen(command, stdout=PIPE, stderr=PIPE) 
    stdout, stderr = p.communicate() 
    print(stdout) 
    print(stderr) 
+0

你能更具體一些問題嗎? 什麼阻止你再次用'command2'調用'Popen'? – Yourstruly

+0

我一直希望使用相同的過程,因爲它需要順序調用命令,所以一個子過程可以一個接一個地運行這兩個命令,而不是多個子過程 –

+0

如果問題是**「順序」**而不是「同步」然後? – Baldrickk

回答

0

你將不得不啓動命令和啓動另一個命令之前等待完成。您應該爲每個命令重複執行此操作。

這是可以做到

ps = [ Popen(c, stdout=PIPE, stderr=PIPE).communicate() 
     for c in command] 

注意,這不論天氣的啓動下一個命令的第一個命令是成功還是失敗。如果你想要啓動下一個命令只有當前一個命令成功,然後使用

def check_execute(commands): 
    return_code = 0 
    for c in commands: 
     p = Popen(c, stdout=PIPE, stderr=PIPE) 
     result = p.communicate() 
     yield result 
     return_code = p.returncode 
     if return_code != 0: 
      break 
0

根據我的理解,以下應該適合你。 先前完成使用後,鏈接執行。

p1 = subprocess.Popen(command, stdout=subprocess.PIPE) 
p2 = subprocess.Popen(command2, stdin=p1.stdout, stdout=subprocess.PIPE) 
print p2.communicate()