2010-06-03 4 views
4

장기 실행 프로세스를 시작해야하는 Python 웹 응용 프로그램이 있습니다. 캐치는 프로세스가 끝나기를 기다리는 것을 원하지 않습니다. 그냥 시작하고 끝내십시오.Python - 웹 응용 프로그램에서 장기 실행 프로세스 시작

Windows XP에서 실행 중이며 웹 응용 프로그램이 IIS에서 실행 중입니다 (문제가있는 경우).

지금까지 나는 popen을 시도했지만 작동하지 않았습니다. 자식 프로세스가 끝날 때까지 기다렸습니다.

+1

대신 "작동하지 않는 것"이라고 쓰고 정확히 무슨 일이 일어 났는지 기록해보십시오. 예외가 발생 했습니까? 기대했던 것과 다른 일을 했습니까? (그렇다면, 그것은 무엇을 했습니까?). 이것은 보통 다른 사람들이 당신을 도울 수있게 해줍니다. –

+0

다음은 유망한 몇 가지 Windows API 명령입니다. 다른 것을 생각해 내지 않으면 사용해 보겠습니다. http://timgolden.me.uk/pywin32-docs/win32api__ShellExecute_meth.html http : // /timgolden.me.uk/pywin32-docs/win32console__FreeConsole_meth.html http://timgolden.me.uk/pywin32-docs/win32process__CreateProcess_meth.html – Greg

답변

6

좋아, 나는 이것을 결국 알아 냈다! 이것은 작동하는 것 같습니다 :

from subprocess import Popen 
from win32process import DETACHED_PROCESS 

pid = Popen(["C:\python24\python.exe", "long_run.py"],creationflags=DETACHED_PROCESS,shell=True).pid 
print pid 
print 'done' 
#I can now close the console or anything I want and long_run.py continues! 

참고 : shell = True를 추가했습니다. 그렇지 않으면 자식 프로세스에서 인쇄를 호출하면 나에게 오류를했다 "IO 오류 : [errno를 9] 잘못된 파일 기술자"

DETACHED_PROCESS가 기본 WINAPI CreateProcess 함수에 전달되는 Process Creation Flag이다.

+1

Unix에서이 작업을 수행하는 방법에 대한 아이디어가 있습니까? – nbarraille

+0

이 플래그는 Unix에서는 필요하지 않습니다. – MarcH

+1

이 기능을 사용하려면 shell = True가 필요 없습니다. 잘못된 파일 설명자 오류는 관련이 없습니다. – MarcH

0

subprocess.Popen입니다.

+1

내가 어떻게 부르는지 알고 있니? 내가 그것을 시도했을 때, 그것은 장기 실행 프로세스가 끝날 때까지 기다렸다. 어쩌면 내가 잘못했다고 생각했을거야. – Greg

+0

응용 프로그램 출력 또는 종료를 기다리지 말아야합니다. – Messa

2

webapp에서 직접 프로세스를 시작하는 대신 작업을 메시지 대기열에 쓸 수 있습니다. 별도의 서비스가 메시지 대기열에서 읽고 작업을 실행합니다. Python으로 작성된 Distributed Task Queue 인 Celery을 살펴보십시오.

0

이 거의 (from here)를 작동합니다

from subprocess import Popen 

pid = Popen(["C:\python24\python.exe", "long_run.py"]).pid 
print pid 
print 'done' 

가 '완료'바로 인쇄 얻을 것이다. 문제는 long_run.py가 돌아올 때까지 위 프로세스가 계속 실행되고 프로세스를 닫으면 long_run.py의 프로세스가 종료된다는 것입니다.

물론 프로세스를 부모 프로세스와 완전히 독립적으로 만드는 몇 가지 방법이 있습니다.

+1

Windows 특정 방식 : http://docs.python.org/library/os.html#os.startfile –

관련 문제