2

system("pause")テストと個人的な概念実証のために、単純な文字列のみを出力してからシステム一時停止(文字通りC ++)を呼び出す.exeファイルがあります。

Windows XP VMでテストしている単純なPythonスクリプトがあり、混乱したときにこれらの操作を実行します。

subprocess.call(r'echo Nothing special. > c:\blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'start c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'del c:\blank.txt', shell=True)

明らかに、これらのコマンドはすべてコマンドラインで単独で正常に機能しますが、Pythonを介して呼び出されたときに正常に機能しないのはなぜですか?

次のポップアップエラーメッセージが表示されます。

blank.txt:ads.exeで問題が発生したため、閉じる必要があります。ご不便をおかけしてしまい申し訳ございません。

何かの途中にいると、作業中の情報が失われる可能性があります。

ファイルも実際に削除されます。.exeがポップアップすることを期待しているときに、システムの一時停止がdeleteコマンドによって押しつぶされたようです。Enterキーを押すのを待ってから、スクリプトを続行してファイルを削除します。

4

3 に答える 3

1

何が起こるかとsubprocess.call(..., shell=True)いうと、シェルにコマンドを実行するように指示しているだけなので、それぞれがすぐに戻ってきます。コマンドラインで、コマンドを使用して実行するexeを呼び出すと、exestartが終了していなくても、すぐに戻ります。すぐに戻ってきて、start待つように言われる必要があります:

subprocess.call(r'echo Nothing special. > c:\blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'start /wait c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'del c:\blank.txt', shell=True)
于 2011-05-20T20:01:12.907 に答える
1

症状を考えると、この実行可能ファイルの初期化が完了すると、この特定の設定(Windows XP、おそらく特定のパッチレベルで、実行可能ファイルが代替ストリームからのものである場合)でのみ安全に実行可能ファイルを削除できると理解しています。ロード中に実行可能ファイルを削除すると、プログラムがクラッシュします。

プロンプトでこれらのコマンドを入力すると、実行start c:\blank.txt:ads.exeとの間に時間が経過del c:\blank.txtし、プログラムがロードを完了するのに十分な時間が与えられます。スクリプトからそれらを実行している場合、2つの間の間隔ははるかに短くなります(start新しいプロセスから分岐し、新しいプログラムの初期化は非同期で行われます)。初期化と削除の間には競合状態があります。どちらが勝つかは、削除が実行されるまでの時間によって異なります。

ファイルを削除する前に、遅延を試してみてください。

import subprocess, time
subprocess.call(r'echo Nothing special. > c:\blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'start c:\blank.txt:ads.exe', shell=True)
time.sleep(42)  # 42 seconds is overkill, but the delay isn't predictable
subprocess.call(r'del c:\blank.txt', shell=True)
于 2011-05-20T20:28:59.077 に答える
0

Windowsシェルstartコマンドは、新しいシェルでプログラムを起動し、続行します。使用が完了するのを待つにはcall

subprocess.call(r'call c:\blank.txt:ads.exe', shell=True)
于 2011-05-20T20:21:26.497 に答える