用python启动一个独立的进程

Posted

技术标签:

【中文标题】用python启动一个独立的进程【英文标题】:Launch an independent process with python 【发布时间】:2012-07-20 01:46:05 【问题描述】:

这确实是一个非常简单的问题,但我似乎找不到任何解决方案。

我有一个 python 脚本,我想启动一个独立的守护进程。我想调用 ym python 脚本,启动这个系统托盘守护进程,对数据库文件执行一些 python 魔术并退出,让系统托盘守护进程运行。

我尝试过os.systemsubprocess.callsubprocess.Popenos.execl,但它总是让我的脚本保持活动状态,直到我关闭系统托盘守护程序。

这听起来应该是一个简单的解决方案,但我什么都做不了。

编辑: Windows 解决方案:os.startfile() http://docs.python.org/library/os.html?highlight=startfile#os.startfile

有时放弃和询问意味着你正处于答案的风口浪尖。

【问题讨论】:

搜索会找到答案。 ***.com/questions/1196074/… 是的,我发现了,但它不起作用。该脚本仅挂起几秒钟,不启动第二个进程并且不执行脚本的其余部分。然后它就死了。我不会在没有搜索并首先尝试自己解决问题的情况下发布问题。 啊,好吧,很抱歉当时的严厉。嗯,奇怪的是,我会检查一些东西,如果我弄明白了就回来。 我确实忘记在原始帖子中包含os.spawn*。这是我在放弃几个小时以清醒头脑并吃午饭之前尝试的第一批产品之一。 【参考方案1】:

您可以使用几个漂亮的 Popen 参数在 Windows 上完成一个真正分离的进程(感谢 greenhat 他的 answer here):

import subprocess

DETACHED_PROCESS = 0x00000008
results = subprocess.Popen(['notepad.exe'],
                           close_fds=True, creationflags=DETACHED_PROCESS)
print(results.pid)

另请参阅 this answer 以获得漂亮的跨平台版本(请确保添加 close_fds,因为它对 Windows 至关重要)。

【讨论】:

这对我有用,应该是 IMO 接受的答案。它仍然允许传递参数,而接受的答案则不允许。【参考方案2】:

Windows 解决方案:os.startfile()

就像您双击一个可执行文件并使其独立启动一样工作。一个非常方便的衬里。

http://docs.python.org/library/os.html?highlight=startfile#os.startfile

【讨论】:

不幸的是,这不允许传递参数。【参考方案3】:

我建议使用双叉方法。

例子:

import os
import sys
import time

def main():
    fh = open('log', 'a')
    while True:
        fh.write('Still alive!')
        fh.flush()
        time.sleep(1)

def _fork():
    try: 
        pid = os.fork() 
        if pid > 0:
            sys.exit(0) 
    except OSError, e: 
        print >>sys.stderr, 'Unable to fork: %d (%s)' % (e.errno, e.strerror) 
        sys.exit(1)


def fork():
    _fork()

    # remove references from the main process
    os.chdir('/')
    os.setsid()
    os.umask(0)

    _fork()

if __name__ == '__main__':
    fork()
    main()

【讨论】:

os.fork() 在 Windows 上不可用。

以上是关于用python启动一个独立的进程的主要内容,如果未能解决你的问题,请参考以下文章

python multiprocessing 独立启动和关闭进程

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

启动一个完全独立的进程

python 进程

简述linux进程的启动、终止的方式以及如何进行进程的查看

python之多线程