如何在Python中生成一个新的独立进程

33

我有一些Python代码,偶尔需要生成一个新进程来以"fire and forget"的方式运行一个shell脚本,即不阻塞。这个shell脚本将不会与原始的Python代码通信,实际上很可能会终止调用Python进程,因此启动的shell脚本不能是调用Python进程的子进程。我需要它作为独立进程启动。

换句话说,假设我有一个名为mycode.py的文件,它会启动script.sh文件。那么,mycode.py将继续处理而不被阻塞。脚本script.sh将独立执行某些操作,然后实际上停止并重新启动mycode.py。因此,运行脚本script.py的进程必须完全独立于mycode.py。我应该如何实现这个功能呢?我认为subprocess.Popen不会阻塞,但仍将创建一个子进程,该子进程在mycode.py停止后立即终止,这不是我想要的。


尝试使用 python-daemon - JBernardo
3个回答

22

尝试在 script.sh 前加上 "nohup"。你可能需要决定如何处理标准输出和标准错误输出;我在示例中只是将其丢弃。

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)

你如何通过这个传递参数? - AngryPanda
你仍然可以使用sys.argv以正常方式传递参数。 - Steve Zelaznik
当我这样做时,进程表中会出现一个僵尸进程。 - a2f0
@dps 还注意到了僵尸进程,这里可能有类似问题的解释:链接 - theParanoidAndroid

6
只需使用subprocess.Popen。以下内容适用于我在Windows XP / Windows 7和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])

0
最简单的方法:
CMD = ['sleep', 'infinity']
os.spawnvpe(os.P_NOWAIT, CMD[0], CMD, os.environ)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接