web-dev-qa-db-ja.com

Pythonで新しい独立したプロセスを生成する方法

いくつかのPythonコードがあります。このコードは、「ファイアアンドフォーゲット」の方法で、つまりブロックなしでシェルスクリプトを実行するために新しいプロセスにまたがる必要がある場合があります。シェルスクリプトは、 Pythonコードで、実際に呼び出し元のPythonプロセスを終了する可能性があります。そのため、起動されたシェルスクリプトは呼び出し元の子プロセスになることはできませんPython process。独立したプロセスとして起動する必要があります。

つまり、mycode.pyがあり、それがscript.shを起動したとしましょう。その後、mycode.pyはブロックせずに処理を続行します。スクリプトscript.shはいくつかのことを独立して行い、その後実際にmycode.pyを停止して再起動します。したがって、script.pyを実行するプロセスは、mycode.pyから完全に独立している必要があります。どのようにこれを行うことができますか? subprocess.Popenはブロックしませんが、mycode.pyが停止するとすぐに終了する子プロセスを作成します。

20
Marc

Script.shの前に「 Nohup 」を追加してみてください。おそらく、stdoutとstderrをどうするかを決める必要があるでしょう。例にドロップします。

import os
from subprocess import Popen

devnull = open(os.devnull, 'wb') # Use this in Python < 3.3
# Python >= 3.3 has subprocess.DEVNULL
Popen(['Nohup', 'script.sh'], stdout=devnull, stderr=devnull)
18
Lasse

Subprocess.Popenを使用するだけです。以下は、Windows XP/Windows 7 and Python 2.5.4、2.6.6、および2.7.4。 py2exe-未試行3.3-クライアントマシン上の期限切れのテストソフトウェアを削除する必要があるため

import os
import subprocess
import sys
from tempfile import gettempdir

def ExitAndDestroy(ProgPath):
    """ Exit and destroy """
    absp = os.path.abspath(ProgPath)
    fn = os.path.join(gettempdir(), 'SelfDestruct.bat')
    script_lines = [
        '@rem Self Destruct Script',
        '@echo ERROR - Attempting to run expired test only software',
        '@pause',
        '@del /F /Q %s' % (absp),
        '@echo Deleted Offending File!',
        '@del /F /Q %s\n' % (fn),
        #'@exit\n',
        ]
    bf = open(fn, 'wt')
    bf.write('\n'.join(script_lines))
    bf.flush()
    bf.close()
    p = subprocess.Popen([fn], Shell=False)
    sys.exit(-1)

if __name__ == "__main__":
   ExitAndDestroy(sys.argv[0])
4
Steve Barnes