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

时间:2013-12-17 23:07:30

标签: python subprocess fork daemon spawn

我有一些Python代码偶尔需要跨越一个新进程来以“一劳永逸”的方式运行shell脚本,即没有阻塞。 shell脚本不会与原始Python代码通信,实际上可能会终止调用Python进程,因此启动的shell脚本不能是调用Python进程的子进程。我需要它作为一个独立的过程启动。

换句话说,假设我有mycode.py并启动了script.sh。然后mycode.py将继续处理而不会阻塞。脚本script.sh将独立完成一些操作,然后实际停止并重新启动mycode.py。因此运行script.py的进程必须完全独立于mycode.py。我怎么能这样做?我认为subprocess.Popen不会阻塞,但是仍然会创建一个子进程,一旦mycode.py停止就会终止,这不是我想要的。

2 个答案:

答案 0 :(得分:18)

尝试将“nohup”添加到script.sh。您可能需要决定如何处理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)

答案 1 :(得分:4)

只需使用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])