私はいくつかの異なるPythonプログラムを一定時間開いてから、閉じるプログラムをRaspberry Piで実行しています。何が問題なのか:
- Python 3 IDE、Thony Python、またはその他のIDEでネイティブプログラムを実行すると、すべてがうまく機能し、すべてのプログラムが期待どおりに開いて閉じます。
- Python 3 IDE、Thony Python、またはその他のIDEでネイティブプログラムを実行していますが、他のターミナルウィンドウが開いている場合(何も実行せずに開いていてアイドル状態のみ)、すべてのプログラムは開いて閉じることはできません。後で。
- ターミナルウィンドウでメインプログラムを実行すると、すべてのプログラムが開きますが、後で閉じることはできません。
コード例
while True:
proc = subprocess.Popen(['lxterminal', '-e', ' test_aa.py'])
proc_bb = subprocess.Popen(['lxterminal', '-e', 'test_bb.py'])
time.sleep(5)
proc.terminate()
proc_bb.kill()
time.sleep(200)
他の例
while True:
print("opening")
proc = subprocess.Popen(['lxterminal', '-e', ' test_aa.py'])
c = proc.pid
print(c)
time.sleep(3)
os.kill(c, signal.SIGTERM)
time.sleep(700)
これは、他の端末ウィンドウを手動で開かなくても機能します。
プログラムを始めるために、私はまたPopenとos.systemのさまざまなバリエーションを試してみましたが、毎回うまくいきました。
終了/終了するには、os.system、os.kill(pid、signal.SIGTERM)、os.kill(pid、signal.SIGINT)などを試しました。 -9 PID、subprocess.Popenで終了し、終了()または終了()
アップデート1
上記の質問によれば、部分的に答えることができるようですが、同時により多くの質問が提起されます。
次のコードを検討してください。
while True:
print("opening")
proc = subprocess.Popen(['lxterminal', '-e', ' test_aa.py'])
c = proc.pid
print(c)
time.sleep(3)
os.kill(c, signal.SIGTERM)
time.sleep(700)
使用
ps aux
私は見つけた
['lxterminal']
そして
['test_aa.py']
別のPID番号で実行しています。だから
c = proc.pid
['lxterminal'] を終了できない理由を説明できる ['test_aa.py'] の pid を提供します。
私は正しいですか?
別のターミナルウィンドウでPythonプログラムを起動しますが、同じPID番号を持っていることを確認する他のオプションは何ですか?
アップデート2
私はpid番号で新しいターミナルウィンドウを実行しています。だからソートされました。また、ゾンビプロセスが実行されていないことを確認するためにコードを使用します。
stdout, stderr = proc.communicate()
proc.wait()
動作し、ゾンビプロセスが実行されていません。
しかし、残念ながら同じ話が再び発生します。ターミナルウィンドウを開いてプログラムを実行すると、プログラムで開始したターミナルは終了しません。私は2つの異なるラズベリーパイを試しました。同じ。
別のターミナルウィンドウを開くと、突然プログラムが閉じないのはなぜですか?
最終更新
私の質問に部分的に答えました。
一部の端末ウィンドウが開いている場合、私のプログラムが他のプログラムを終了しない理由はまだ理解されていませんが、解決策が見つかりました。変える
lxterminal,
使っています
uxterm #uterm can also be used
私のコードは次のようになります。
proc = subprocess.Popen([‘uxterm’, ‘-e’, ‘test_aa.py’], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=os.setsid)
完璧に動作します。ターミナルウィンドウで別のプログラムを実行し、再起動後に.shファイルを使用してすべてを再度有効にすることができます。
これが私が探していたものです:-)
助けてくれてありがとう。