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

如何在Python中生成新的独立进程,python,subprocess,fork,daemon,spawn,Python,Subprocess,Fork,Daemon,Spawn,我有一些Python代码,偶尔需要跨越一个新进程,以“fire-and-forget”方式运行shell脚本,即不阻塞。shell脚本不会与原始Python代码通信,实际上可能会终止调用Python进程,因此启动的shell脚本不能是调用Python进程的子进程。我需要它作为一个独立的进程启动 换句话说,假设我有mycode.py并启动script.sh。然后mycode.py将继续处理而不阻塞。script.sh将独立完成一些操作,然后实际停止并重新启动mycode.py。因此,运行scrip

我有一些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停止时立即终止,这不是我想要的。

尝试在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)
导入操作系统
从子流程导入Popen
devnull=open(os.devnull,'wb')#在Python<3.3中使用它
#Python>=3.3具有subprocess.DEVNULL
Popen(['nohup','script.sh'],stdout=devnull,stderr=devnull)

只需使用subprocess.Popen即可。以下内容在Windows XP/Windows7和Python 2.5.4、2.6.6和2.7.4上运行正常。在使用py2exe进行转换后(没有尝试过3.3),这是因为需要删除客户端计算机上过期的测试软件


尝试如何传递参数?您仍然可以使用sys.argv以正常方式传递参数。当我这样做时,进程表中有一个已失效的进程。@dps也注意到了已失效的进程,这似乎是对类似问题的解释。
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])