14

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

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

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

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

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

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

4

3 回答 3

8

您可以使用几个漂亮的Popen参数在 Windows 上完成一个真正分离的过程(感谢 greenhat 在这里的回答):

import subprocess

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

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

于 2017-02-28T03:39:03.920 回答
7

适用于 Windows 的解决方案:os.startfile()

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

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

于 2012-07-24T12:54:03.073 回答
2

我建议使用双叉方法。

例子:

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()
于 2012-07-20T19:06:55.140 回答