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