Python を使用して外部プログラムを実行しています。また、Python が呼び出されたプログラムにいくつかのキーストロークを送信して、自動ログインを完了するようにしたいと考えています。
問題は、subprocess.call() を使用して外部プログラムを実行したときに、プログラムがシステム フォーカスを取得し、外部プログラムを閉じるまで Python スクリプトが応答できなかったことです。
これについて何か提案はありますか?どうもありがとう。
subprocess.Popen()
の代わりに使用.call()
stdin 、stdout、およびstderrファイル記述子Popen
も制御できるため、外部プログラムとやり取りできる可能性があります。
愚かな例:
s = subprocess.Popen(command, stdout=subprocess.PIPE,
stderr=subprocess.PIPE) # The script is not blocked here
# Wait to finish
while s.poll() is None: # poll() checks if process has finished without blocking
time.sleep(1)
... # do something
# Another way to wait
s.wait() # This is blocking
if s.returncode == 0:
print "Everything OK!"
else:
print "Oh, it was an error"
いくつかの便利な方法:
Popen.poll() 子プロセスが終了したかどうかを確認します。returncode 属性を設定して返します。
Popen.wait() 子プロセスが終了するのを待ちます。returncode 属性を設定して返します。
Popen.communicate(input=None) プロセスと対話: stdin にデータを送信します。ファイルの終わりに達するまで、stdout および stderr からデータを読み取ります。プロセスが終了するのを待ちます。オプションの入力引数は、子プロセスに送信する文字列にするか、データを子プロセスに送信しない場合は None にする必要があります。
ドキュメントにはさらに多くの情報があります