1

プログラムを起動するためのコンソール ベースのラッパーを作成したいのですが、'urxvt -e myscript' またはそのバリアントを使用して実行しようとしない限り、正常に動作します。例えば:

test.py

#!/usr/bin/python2.7
import subprocess

print 'Press enter to launch'
raw_input()

subprocess.Popen( ['firefox'] )

./test.py を使用してターミナルでこれを実行すると、期待どおりに動作します。Firefox が起動し、スクリプトが存在します。しかし、「urxvt -e ./test.py」でこれを試すと、スクリプトが開き、実行され、Firefox が起動します。しかし、スクリプトが終了すると、Firefox は強制終了されます。

「term -e script」を使用してスクリプトを実行すると、スクリプトが終了したときにプログラムが強制終了されないように、プログラムを起動するにはどうすればよいですか。

編集:より明確にするために:Pythonスクリプトを実行する新しい端末を起動したい。スクリプトがその役割を果たし、プログラムを起動します。その後、スクリプトが終了し、ターミナルが閉じ、プログラムは実行されたままになります。

4

3 に答える 3

1

これをテストしたところ、結果は起動するプログラムに大きく依存しており、問題はPythonとは何の関係もないことがわかりました。私はそれに気づきませんでしたが、「term -e program」は一部のプログラムでのみ機能し、他のプログラムは私が得ていた動作で終了します。一部のプログラムは継承されたpid/sidを保持しませんが、他のプログラムは保持します。

例えば

>>> print os.getpid()
3556
>>> os.execl( '/usr/bin/gvim', 'gvim' )

簡単な「ps-e」が表示されます

3556 pts/1    00:00:00 gvim <defunct>
3557 ?        00:00:00 gvim

起動端末が閉じると、同じsidを持つすべてのプロセスが閉じます。したがって、「gvim defunct」は消えますが、もう一方は存続します。新しいpid/sidを取得しないプログラムは、起動端末が閉じると終了します。解決策は、プロセスに新しいsidを強制することでした。

import os

if os.fork():
    # parent
    do_stuff()

else:
    # child
    os.setsid()
    os.execl('prog', 'prog')
于 2012-06-17T00:55:22.170 に答える
1

起動するコマンドにアンパサンド記号 (&) を追加します。

subprocess.Popen( ['firefox &'] )
于 2012-06-16T16:39:05.560 に答える
0
import os

print 'Press enter to launch'
raw_input()

if os.fork():
    # Parent
    print 'clean up'
    raw_input()

else:
    # Child
    os.execl('/usr/bin/firefox', 'firefox')

os.execlは、python プロセスを firefox プロセスに置き換えます。

ご指摘のとおり、subprocess.Popen を使用すると、スクリプトが終了すると、firefox サブプロセスが強制終了されます。

ではos.execl、スクリプト自体は終了しません。これは、(即時に) 終了しない (そして強制終了されない) Firefox プロセスに置き換えられます。os.execlコマンドに到達すると、 を呼び出したかのように効果的に動作しますterm -e firefox

于 2012-06-16T16:37:10.697 に答える