2013-12-17 2 views
13

가끔 파이어 코드를 사용하여 "fire and forget"방식으로 셸 스크립트를 실행하는 새로운 프로세스를 확장해야합니다. 셸 스크립트는 원래의 파이썬 코드와 통신하지 않으며 실제로 파이썬 프로세스 호출을 종료하므로 실행 된 셸 스크립트는 호출하는 파이썬 프로세스의 자식 프로세스가 될 수 없습니다. 독립된 프로세스로 시작해야합니다.파이썬에서 새로운 독립적 인 프로세스를 생성하는 법

다른 말로하면 mycode.py를 갖고 있고 script.sh를 시작한다고 가정 해 봅시다. 그런 다음 mycode.py는 차단하지 않고 계속 처리합니다. 스크립트 script.sh는 독립적으로 몇 가지 작업을 수행하고 실제로 mycode.py를 중지했다가 다시 시작합니다. 따라서 script.py를 실행하는 프로세스는 mycode.py와 완전히 독립적이어야합니다. 내가 정확히 이것을 어떻게 할 수 있을까? 나는 subprocess.Popen이 차단되지는 않지만 mycode.py가 끝나자 마자 종료하는 자식 프로세스를 만들 것이라고 생각한다.

+0

봅니다 [파이썬 데몬 (https://pypi.python.org/pypi/python-daemon/는) – JBernardo

답변

13

script.sh에 "nohup"을 붙이십시오. 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) 
+0

이 작동하는 것 같다 - 감사합니다! – Marc

+0

이상하다. 명령 끝에 '&'가 필요하다. – boh

+0

이것을 통해 인수를 어떻게 전달합니까? – AngryPanda

1

그냥 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]) 
관련 문제