web-dev-qa-db-ja.com

Python popenコマンド。コマンドが終了するまで待ちます

シェルコマンドをpopenで起動するスクリプトがあります。問題は、そのpopenコマンドが終了してすぐに続行するまでスクリプトが待機しないことです。

om_points = os.popen(command, "w")
.....

Pythonスクリプトにシェルコマンドが終了するまで待機するように指示するにはどうすればよいですか?

62
michele

スクリプトの動作方法に応じて、2つのオプションがあります。コマンドをブロックし、実行中に何もしない場合は、subprocess.call

#start and block until done
subprocess.call([data["om_points"], ">", diz['d']+"/points.xml"])

実行中に何かを実行したい場合、またはstdinにフィードしたい場合は、communicate呼び出しの後にpopenを使用できます。

#start and process things, then wait
p = subprocess.Popen([data["om_points"], ">", diz['d']+"/points.xml"])
print "Happens while running"
p.communicate() #now wait plus that you can send commands to process

ドキュメントに記載されているように、waitはデッドロックする可能性があるため、通信することをお勧めします。

92
unholysampler

subprocessを使用してこれを実現できます。

import subprocess

#This command could have multiple commands separated by a new line \n
some_command = "export PATH=$PATH://server.sample.mo/app/bin \n customupload abc.txt"

p = subprocess.Popen(some_command, stdout=subprocess.PIPE, Shell=True)

(output, err) = p.communicate()  

#This makes the wait possible
p_status = p.wait()

#This will give you the output of the command being executed
print "Command output: " + output
17
Touchstone

探しているのは wait メソッドです。

5
Olivier Verdier

wait() は私には問題ありません。サブプロセスp1、p2、p3は同時に実行されます。したがって、すべてのプロセスは3秒後に行われます。

import subprocess

processes = []

p1 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, Shell=True)
p2 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, Shell=True)
p3 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, Shell=True)

processes.append(p1)
processes.append(p2)
processes.append(p3)

for p in processes:
    if p.wait() != 0:
        print("There was an error")

print("all processed finished")
1
Simon Bachmann

渡そうとしているコマンドを

os.system('x')

それから声明に変換します

t = os.system('x')

これでpythonはコマンドラインからの出力を待機し、変数tに割り当てられるようになります。