Запуск независимого процесса с python

Это действительно простой вопрос, но я не могу найти никакого решения.

у меня есть скрипт python, и я хочу запустить независимый процесс демона. Я хочу вызвать YM Python script, запустить этот системный трей dameon, сделать некоторую магию python в файле базы данных и выйти, оставив демон системного трея запущенным.

Я пробовал os.system, subprocess.call, subprocess.Popen, os.execl, но он всегда поддерживает мой скрипт, пока я не закрою демон системного трея.

это звучит так, как будто это должно быть простое решение, но я ничего не могу заставить работать.

изменить: Решение для 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()

решение для Windows:os.startfile()

работает так, как если бы вы дважды щелкнули исполняемый файл и заставили его запускаться независимо. Очень удобный лайнер.

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


вы можете использовать пару nifty 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).