複数のコードを順番に実行する Python で発生する同期および非同期の問題

1. 1 つの Python コードを実行した直後に別の Python コードを実行するには、Python モジュールを使用しますsubprocessこのモジュールは、新しいプロセスを作成して対話することができ、Python コードで新しいプログラムやスクリプトを開始するために使用できます。

code1.py完了直後に実行するコード例を次に示しますcode2.py

import subprocess

subprocess.run(['python', 'code1.py'], check=True)
subprocess.run(['python', 'code2.py'], check=True)

上記のコードは、メイン プロセスで 2 つのサブプロセスを連続して実行し、最初のサブプロセスが run code1.py、それが終了すると、メイン プロセスは 2 番目のサブプロセス、つまり run の実行を開始しますcode2.py

このうち、check=Trueこのパラメータは、子プロセスの実行中にエラーが発生した場合に例外がスローされることを示し、このパラメータが設定されていない場合は例外がスローされません。

2. Python の入力ボックスに自動的に文字を入力して Enter キーを押すには、subprocessモジュールの Popen() メソッドを使用して新しいプロセスを開始し、標準入力ストリームに送信されるデータをプロセスに渡します。 。

デモンストレーションとして、サンプル コードを次に示します。

import subprocess

# 启动一个新的子进程
process = subprocess.Popen(['python'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

# 将要输入的数据写入标准输入流,并换行
process.stdin.write(b'a\n')
# 刷新缓冲区
process.stdin.flush()

# 读取并打印子进程输入
output, errors = process.communicate()
print(output.decode('utf-8'))

run が Popen に置き換えられ、Popen の機能は新しいプロセスを開始し、標準入力ストリームに送信されるデータをプロセスに渡すことであることがわかります。

要件が次の場合: 一部のコードの場合: 実行後に次のコードを実行する: その後は run を使用します。
他のコードの場合は、一定時間実行する必要があります。この時間まで実行した後、シャットダウンして次のコードを実行します。必要に応じて、Popen を使用できます
が、問題が発生しました: Popen が実行されると、次のコードが開始されます。これは、スレッドの実行を開始する同期スレッドであるため、元のスレッドは続行されます。 run は非同期で実行され、終了します 次の実行が継続されるため、問題は Popen にあります Popen 操作が終了する前に run コードを実行する問題を解決する必要があります。

例:

p1 = subprocess.Popen(['python', r"测试run和Popen01.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p1.terminate()
p1.wait()

subprocess.run(['python', r"测试run和Popen02.py"], input=b"q\n")
# shutdown_chromes("Chrome")

p3 = subprocess.Popen(['python', r"测试run和Popen03.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p3.terminate()
p3.wait()
#
p3 = subprocess.Popen(['python', r"测试run和Popen04.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p3.terminate()
p3.wait()

subprocess.run(['python', r"测试run和Popen01.py"], input=b"q\n")

subprocess.run(['python', r"测试run和Popen02.py"], input=b"q\n")

p3 = subprocess.Popen(['python', r"测试run和Popen03.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p3.terminate()
p3.wait()

subprocess.run(['python', r"测试run和Popen04.py"], input=b"q\n")

p3 = subprocess.Popen(['python', r"测试run和Popen01.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p3.terminate()
p3.wait()
subprocess.run(['python', r"测试run和Popen02.py"], input=b"q\n")

操作結果: 

順番に出力していきましょう!

 wait() がない場合は、混乱します。

p1 = subprocess.Popen(['python', r"测试run和Popen01.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p1.terminate()
# p1.wait()

subprocess.run(['python', r"测试run和Popen02.py"], input=b"q\n")
# shutdown_chromes("Chrome")

p3 = subprocess.Popen(['python', r"测试run和Popen03.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p3.terminate()
# p3.wait()
#
p3 = subprocess.Popen(['python', r"测试run和Popen04.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p3.terminate()
# p3.wait()

subprocess.run(['python', r"测试run和Popen01.py"], input=b"q\n")

subprocess.run(['python', r"测试run和Popen02.py"], input=b"q\n")

p3 = subprocess.Popen(['python', r"测试run和Popen03.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p3.terminate()
# p3.wait()

subprocess.run(['python', r"测试run和Popen04.py"], input=b"q\n")

p3 = subprocess.Popen(['python', r"测试run和Popen01.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p3.terminate()
# p3.wait()
subprocess.run(['python', r"测试run和Popen02.py"], input=b"q\n")

 

 つまり、要約すると次のようになります。

Popen と wait() を使用するとさらに香りが良くなります。

Supongo que te gusta

Origin blog.csdn.net/conquer_galaxy/article/details/130224388
Recomendado
Clasificación