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

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

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

2 ответов


попробуйте знаком "nohup " к script.sh - ... Вероятно, вам нужно будет решить, что делать с 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)

просто использовать подпроцесс.К popen. Следующее работает нормально для меня в Windows XP / Windows 7 и Python 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])