Подтвердить что ты не робот

Как создать новый независимый процесс в python

У меня есть некоторый код python, который иногда должен охватывать новый процесс для запуска оболочки script в режиме "огонь и забыть", то есть без блокировки. Оболочка script не будет связываться с исходным кодом python и на самом деле, вероятно, завершит процесс вызова python, поэтому запущенная оболочка script не может быть дочерним процессом вызывающего процесса python. Мне нужно, чтобы он запускался как самостоятельный процесс.

Другими словами, скажем, у меня есть mycode.py и запускается script.sh. Затем mycode.py продолжит обработку без блокировки. script script.sh будет делать некоторые вещи независимо, а затем фактически остановит и перезапустит mycode.py. Таким образом, процесс, выполняющий script.py, должен быть полностью независим от mycode.py. Как я могу это сделать? Я думаю, что subprocess.Popen не будет блокировать, но все равно будет создавать дочерний процесс, который завершается, как только mycode.py останавливается, что не то, что я хочу.

4b9b3361

Ответ 1

попробуйте добавить "nohup" в script.sh http://en.wikipedia.org/wiki/Nohup. Вам, вероятно, нужно будет решить, что делать с stdout и stderr, я просто отброшу его в примере.

import os
from subprocess import Popen

devnull = open(os.devnull, 'wb') # use this in python < 3.3
# python >= 3.3 has subprocess.DEVNULL
Popen(['nohup', 'script.sh'], stdout=devnull, stderr=devnull)

Ответ 2

Просто используйте subprocess.Popen. Следующее работает нормально для меня на Windows XP и 7 и pythons 2.5.4, 2.6.6 и 2.7.4 и после преобразования с py2exe - не проверено 3.3 - оно исходит из необходимости удаления истекшего тестового программного обеспечения на машине клиентов.

import os
import subprocess
import sys
from tempfile import gettempdir

def ExitAndDestroy(ProgPath):
    """ Exit and destroy """
    absp = os.path.abspath(ProgPath)
    fn = os.path.join(gettempdir(), 'SelfDestruct.bat')
    script_lines = [
        '@rem Self Destruct Script',
        '@echo ERROR - Attempting to run expired test only software',
        '@pause',
        '@del /F /Q %s' % (absp),
        '@echo Deleted Offending File!',
        '@del /F /Q %s\n' % (fn),
        #'@exit\n',
        ]
    bf = open(fn, 'wt')
    bf.write('\n'.join(script_lines))
    bf.flush()
    bf.close()
    p = subprocess.Popen([fn], shell=False)
    sys.exit(-1)

if __name__ == "__main__":
   ExitAndDestroy(sys.argv[0])