2014-07-25 4 views
0

오늘이 문제가 발생하여 win7x64 컴퓨터에서 Python 2.7.6으로 실행되는이 작은 스크립트 스텁을 사용하여 반복했지만이 문제는 다양한 휴대용 Python을 사용하여 발생했습니다 SOMETHINGELSE 포 그라운드에서 프로세스를 시작하고 종료하고 리턴 코드, 표준 출력 및 표준 오류를 인쇄 할 수 파이썬 스크립트를 기다립니다,하지만 두 번째 전화에서, 어떻게됩니까 훨씬 더 큰 스크립트subprocess.poll의 Python 구문 오류

from subprocess import PIPE, Popen 
from time import sleep 
class Test(object): 
    def run_cmd(self, cmd, wait=True): 
     p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE) 
     if wait: 
      p.communicate() 
      return p 
     else: 
      return p 
    def something(self): 
     p = self.run_cmd('notepad', wait=False) 
     import pdb; pdb.set_trace() 
     while not p.poll(): 
      print 'process still running' 
      sleep(10) 
     print p.returncode, p.stdout, p.stderr 
    def somethingelse(self): 
     p = self.run_cmd('notepad')   
     print p.returncode, p.stdout, p.stderr 

t = Test() 
t.somethingelse() 
t.something() 

에서 Windows 플랫폼, 무엇인가, 프로세스가 시작되었지만 프로세스를 끝내 든 끝내 든, 파이썬은 루프에 머물러 있습니다. 나는 다음 PDB 단계를 추가하고이 대신 프로세스가 열려있는 동안 없음을 반환하지의, 여론 조사

>>> t.something() 
> <stdin>(12)something() 
(Pdb) print p 
<subprocess.Popen object at 0x0000000002D73D68> 
(Pdb) p.poll() 
*** SyntaxError: SyntaxError('invalid syntax', ('<string>', 1, 1, '.poll()')) 
(Pdb) 

출력, 그리고 설정이 /가 완료 리턴 코드를 반환 항상 함께, None을 돌려 준다 디버거에서만 추가 출력. 프로세스가 시작되고 예상대로 작동합니다. 내가 뭘하는지 모든 아이디어는 subprocess.poll을 '잘못된 구문'을 반환하는 원인이 무엇입니까? 이상하게도 예외는 발생하지 않으므로 반환 코드를 반환하도록 업데이트되지 않으며 p.pid, p.stdin, p.stdout 모두 동일한 오류가 발생하지만 디버거에서만 다시 인쇄됩니다. .

+0

나는 그것이 내가 가지고있는 라이브러리있을 수 있습니다 우려,하지만 난 그냥 파이썬 2.7.8 Winx64 새로 설치에서이 작업을 실행하고 동일하게 동작한다. – Wyrmwood

+0

파이썬 2.6/linux에서 이런 종류의 논리를 가지고 있으며이 문제가 없습니다. – Wyrmwood

답변

1
내가 PDB의 SyntaxError에 대해 무엇인지 확실하지 않다

하지만,이 : preturncode 좋은 가능성이다, 0이면

while not p.poll(): 
    print 'process still running' 
    sleep(10) 

무한 루프를 입력합니다.

사용이 대신 :

while p.poll() is None: 
    print 'process still running' 
    sleep(10) 
+0

쳇, 내가 그걸 생각하지 않았다는 것을 믿을 수 없어 ... :) 고마워. – Wyrmwood