98

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

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

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

4

7 に答える 7

122

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

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

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

#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デッドロックが発生する可能性があるため、通信することをお勧めします。

于 2010-05-14T20:15:36.320 に答える
36

これを達成するために使用できます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
于 2016-08-15T14:09:16.537 に答える
20

popen次の手順を実行して、すべての出力が読み取られるまで続行しないように強制します。

os.popen(command).read()
于 2019-11-20T17:37:03.780 に答える
11

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

os.system('x')

それからあなたはそれを声明に隠します

t = os.system('x')

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

于 2018-04-13T14:23:12.663 に答える
5

あなたが探しているのはwait方法です。

于 2010-05-14T20:07:06.610 に答える
4

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")
于 2018-11-15T21:10:55.343 に答える
0

process.communicate()は、サイズの小さい出力に適していると思います。より大きな出力の場合、それは最善のアプローチではありません。

于 2020-11-04T07:28:15.000 に答える