2016-08-11 7 views
1

일부 병렬 처리 마법을 수행하고 마지막으로 Flask gui_loop을 입력하는 Python2.7 스크립트가 있습니다. 어떤 시점에서 스레드는 subprocess.Popen을 사용하여 백그라운드 프로세스를 만듭니다. 이 작동합니다.파이썬 subprocess.Popen() - 서브 프로세스로 인해 소켓이 열린 상태로 유지됨

내 스크립트가 종료하고 하위 프로세스가 여전히 실행중인 경우 플라스크 gui_loop이 실패로, 나는 다시 내 스크립트를 실행할 수없는 경우 : NETSTAT 땅콩으로

socket.error: [Errno 98] Address already in use 

나는 소켓의 소유권을 볼 수 있습니다 파이썬 스크립트가 종료되면 자식 프로세스로 넘어갑니다. 이것은 파이썬 스크립트와 서브 프로세스가 모두 실행 때 모습입니다 :

[email protected]:/tmp# netstat -peanut | grep 5000 
tcp  0  0 127.0.0.1:5000   0.0.0.0:*    LISTEN  1000  840210  21458/python  

를, 소켓이 닫히지하지 파이썬 스크립트를 종료 한 후하지만 소유권은 자식 프로세스에 전달됩니다

[email protected]:~/PycharmProjects/foo/gui# netstat -peanut | grep 5000 
tcp  0  0 127.0.0.1:5000   0.0.0.0:*    LISTEN  1000  763103  19559/my-subprocess 

가 있는가 이 주변에 어떤 방법이 있니? 서브 프로세스 (C로 작성)는 소켓에서 아무 작업도 수행하지 않으므로 필요하지 않습니다. 어떻게 든 gui 루프 소켓 리소스를 전달하지 않고 서브 프로세스를 만들 수 있습니까?

물론 프로세스를 종료 할 수 있지만 GUI의 일부 스크립트를 종료하고 GUI 스크립트가 종료되면 진행 상황을 잃지 않는 간단한 GUI를 작성하는 것이 이상적이지 않습니다. 방금 GUI 스크립트를 실행하여 다시 실행할 수있는 경우 서브 프로세스에 대한 연결을 다시 연결하는 메커니즘이 있습니다.

R

답변

4

하위 프로 시저를 만들 때 close_fds=True을 사용해야합니다. 그러면 하위 프로세스에서 모든 파일 설명자와 열린 소켓이 닫힙니다 (stdin/stdout/stderr 제외).

대부분의 경우 당신은 자식 프로세스의 모든 열린 파일 디스크립터를 상속하지 않는 한 최신 버전 (파이썬 3.2 이상) close_fds 이미 디폴트 True

,하지만 python2.7에서 당신은 여전히 ​​명시 적으로 지정해야 .

+0

이것은 트릭을 수행하는 것 같습니다. 감사. –

1

당신은 문을 사용하여 시도 할 수 있습니다. 여기에 일부 문서 : 당신을 위해

http://preshing.com/20110920/the-python-with-statement-by-example/ 
https://www.python.org/dev/peps/pep-0343/ 

이 열리지/닫기 정리.

관련 문제