Запуск независимого процесса с 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).
