popenシェルコマンドで起動するスクリプトがあります。問題は、スクリプトがそのpopenコマンドが終了するまで待機せず、すぐに続行することです。
om_points = os.popen(command, "w")
.....
シェルコマンドが終了するまで待つようにPythonスクリプトに指示するにはどうすればよいですか?
popenシェルコマンドで起動するスクリプトがあります。問題は、スクリプトがそのpopenコマンドが終了するまで待機せず、すぐに続行することです。
om_points = os.popen(command, "w")
.....
シェルコマンドが終了するまで待つようにPythonスクリプトに指示するにはどうすればよいですか?
スクリプトの操作方法に応じて、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
デッドロックが発生する可能性があるため、通信することをお勧めします。
これを達成するために使用できます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
popen
次の手順を実行して、すべての出力が読み取られるまで続行しないように強制します。
os.popen(command).read()
渡そうとしているコマンドを
os.system('x')
それからあなたはそれを声明に隠します
t = os.system('x')
これで、Pythonはコマンドラインからの出力を待機し、変数に割り当てることができるようになりますt
。
あなたが探しているのはwait
方法です。
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")
process.communicate()は、サイズの小さい出力に適していると思います。より大きな出力の場合、それは最善のアプローチではありません。