1

次で始まるサブプロセスを強制終了しようとしています:

playing_long = Popen(["omxplayer", "/music.mp3"], stdout=subprocess.PIPE)

そしてしばらくすると

pid = playing_long.pid
playing_long.terminate()
os.kill(pid,0)
playing_long.kill()

これは機能しません。ここで指摘された解決策もありません

shell=True で起動された Python サブプロセスを終了する方法

私はスレッドを使用していることに注意してください。スレッドを使用するときに preexec_fn を使用することはお勧めしません (または、少なくともこれは私が読んだものですが、とにかく動作しません)。

なぜ機能しないのですか?コードにエラー メッセージはありませんが、mp3 ファイルのリッスンを停止するには、プロセスを手動で kill -9 する必要があります。

ありがとう

編集:ここから、kill() の後に wait() を追加しました。驚いたことに、プロセスを再開する前に、これがまだ待機しているかどうかを確認して、mp3 ファイルでコーラスを開始しないようにしています。

  • wait() がなければ、システムはプロセスが生きていることを認識します。

  • wait() を使用すると、システムはプロセスが停止していることを認識し、プロセスを再開します。

  • ただし、プロセスはまだ聞こえています。どう見ても殺せそうにない。

EDIT2: 問題は、omxplayer が私が殺さない 2 番目のプロセスを開始し、それが実際の音楽を担当していることです。

  • インターネットのいくつかの場所で見つかったこのコードを使用しようとしましたが、誰にとってもうまくいくようですが、私にはうまくいきません

    playing_long.stdin.write('q')
    playing_long.stdin.flush()
    

そして、「NoneType」オブジェクトには属性「書き込み」がありません。popen プロセスを開始した直後にこのコードを使用しても、同じメッセージで失敗します

playing_long = subprocess.Popen(["omxplayer", "/home/pi/Motion_sounds/music.mp3"], stdout=subprocess.PIPE)
time.sleep(5)
playing_long.stdin.write('q')
playing_long.stdin.flush()

EDIT3: 問題は、popen 行に stdin 行を確立していなかったことです。今は

playing_long = subprocess.Popen(["omxplayer", "/home/pi/Motion_sounds/music.mp3"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
time.sleep(5)
playing_long.stdin.write(b'q')
playing_long.stdin.flush()

*標準入力に書き込むのはバイトであることを指定する必要があります

4

1 に答える 1