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

Posted

技术标签:

【中文标题】如何在 Python 中生成一个新的独立进程【英文标题】:How to spawn a new independent process in Python 【发布时间】:2014-01-05 22:40:55 【问题描述】:

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

【问题讨论】:

试试python-daemon 【参考方案1】:

尝试在 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)

【讨论】:

你如何通过这个传递参数? 您仍然可以使用 sys.argv 以正常方式传递参数。 执行此操作时,我在进程表中得到一个已失效的进程。 @dps 也注意到了已失效的进程,似乎是对类似问题的解释here。【参考方案2】:

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

【讨论】:

以上是关于如何在 Python 中生成一个新的独立进程的主要内容,如果未能解决你的问题,请参考以下文章

如何在存储过程中生成新的 Guid?

如何在 Binance 中生成新的存款 Tether 地址

保持子进程活着并继续给它命令? Python

如何在python中生成数组的排列?

如何在 Python 中生成动态(参数化)单元测试?

如何在 python 中生成唯一的身份验证令牌?