バックグラウンドでPythonスクリプトを実行した後に対話型Pythonシェルを開く

バックグラウンドでPythonスクリプトを実行した後に対話型Pythonシェルを開く

python3 -i test.pytest.pyを実行したら、対話型Pythonシェルを開きます。ただし、バックグラウンドで実行しようとすると、ジョブpython3 -i test.py & は自動的に停止します^C

[4]+  Stopped                 python3 -i test.py

その後、Pythonの対話型シェルにアクセスできなくなります(test.pyの変数はまだ環境にあります)。fgingプロセス(例:)fg %4は、私の入力は表示されませんが、を押しても引き続き実行される対話型シェルを作成します<Enter>。 test.pyをバックグラウンドで実行した後に対話型シェルを「正常に」実行するにはどうすればよいですか?

(参考としてtest.pyでは

from time import sleep
a = 'hello world'
for i in range(10):
    sleep(1)
    print(a)

私の殻は次のとおりです

$ python3 -i test.py &
[4] 6708
$ hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
fg %4
python3 -i test.py
>>> 'hello world'
>>>

a最初のプロンプトの後に入力しましたが、>>>何も表示されませんでした。 )

- 編集者@muru -

fgで正常に実行してbgに送信すると、次のようになります。

$
$
$ python3 -i test.py
hello world
hello world
hello world
hello world
^Z
[4]+  Stopped                 python3 -i test.py
$ bg %4
[4]+ python3 -i test.py &
$ hello world
hello world
hello world
hello world
hello world
hello world
echo 'hello world'
hello world

[4]+  Stopped                 python3 -i test.py
$
$

シェルが入力を待っていますが、echo 'hello world'10個の「Hello World」の後に入力しました。

ベストアンサー1

これは、「レース」の背後にあるPythonインタプリタがプログラムのtest.py実行を完了した後にコマンドラインシェルを使用してプロンプトを表示するために発生します。

当然、Pythonは当時の対話が許されなかったので、この「戦い」で敗北しました。ただし、fgコマンドによっては完全に再開できない状態で、独自のプロンプトを残すには遅すぎます。

この問題を解決する1つの方法は、Pythonプログラムの最後に次の行を追加することです。

import os, signal  # access os-level functions and UNIX-signals
os.kill(os.getpid(), signal.SIGSTOP)  # send myself the UNIX SIGSTOP signal

(もちろん、import通常はプログラムの上に配置することもできます。)

このos.kill()行は、間違った瞬間にインタラクティブな状態に入ろうとしているように、Pythonインタプリタを停止します。ただし、今回はメッセージを表示する前にそれ自体で実行されるため、一貫性のない状態のままではありません。

os.kill()コマンドラインシェルでPythonが停止したことを知らせるので、この目標に達した時期を知ることができます。この時点で、fg Pythonは引き続き実行され、os.kill()独自の対話型セッションを開始します。

bg停止した後は再開しないでくださいos.kill()。これを行うと、カーネルがバックグラウンドで対話を試みるためにPythonを再び停止するだけです。

おすすめ記事