python3 -i test.py
test.pyを実行した後、インタラクティブなPythonシェルを開きます。私はバックグラウンドでそれを実行しようとする場合は、python3 -i test.py &
ジョブに自動的に停止^C
し、ショー
[4]+ Stopped python3 -i test.py
、その後、Pythonのインタラクティブシェルにアクセスできません(test.pyの変数はまだ環境内にあります)。fg
プロセスを実行すると(つまり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個の「HelloWorld」の後に入力しました。
これは、バックグラウンドのPythonインタープリターが、test.py
プログラムの実行を終了するとすぐに、プロンプトをコマンドラインシェルと「競合」させるために発生します。
当然のことながら、Pythonはその「戦い」を失います。なぜなら、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が再開され、Pythonがos.kill()
回線から続行されるため、独自のインタラクティブセッションが開始されます。
bg
それによって停止された後、それを再開するために使用しないでください。os.kill()
そうすると、バックグラウンドでインタラクティブになろうとしたためにカーネルがPythonを再び停止するだけです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加