2017-03-22 2 views
0

하위 프로세스에서 원하는 작업을 수행하는 데 문제가 있습니다. 입력 파일을 가져 오는 테스트 도구가 있습니다. testtool.exe -f를 실행하고 명령 프롬프트에서 실행할 때 이와 같은 출력을 생성합니다.Popen을 사용하여 한 스트림에서 모든 것을 출력합니다.

12:30:46 INFO Output- Processing arguments 
12:30:46 INFO Output- Arguments ok 
12:30:46 INFO Output- Doing something 
12:30:46 INFO Output- More Stuff 
12:30:03 ERROR Output- Error found 
12:30:03 INFO Output- Finished 
12:30:03 INFO Output- Exiting 

그래서이 도구를 python Python 3.4.3에서 실행하려면 subprocess를 사용하려고합니다. 예를 들어 ...

proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True).communicate()[0].decode('utf-8') 
for i in proc.splitlines(): 
    print("> {0}".format(i)) 

불행히도 출력에 'ERROR'행이 없습니다. 나는 그것이 내가 그것에 대한 추가 검증을 할 필요가 있기 때문에 내가 명령 프롬프트에서 얻을 줄 정확히 출력을하고 싶다. 얼마나 많은 오류 라인이 나타나는 지, 출력에 나타나는 오류 라인 수. 그래서 ERROR와 INFO 라인을 다른 스트림으로 나누는 것은 나에게 적합하지 않습니다.

> 12:30:46 INFO Output- Processing arguments 
> 12:30:46 INFO Output- Arguments ok 
> 12:30:46 INFO Output- Doing something 
> 12:30:46 INFO Output- More Stuff 
> 12:30:03 INFO Output- Finished 
> 12:30:03 INFO Output- Exiting 

나는 또한

proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=STDOUT, shell=True).communicate()[0].decode('utf-8') 

을 시도하고이 .. 또한

proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True) 
    proc_data = proc.communicate() 

    for i in proc_data[0].splitlines(): 
     print ("INFO> {0}".format(i)) 

    for i in proc_data[1].splitlines(): 
     print ("ERROR> {0}".format(i)) 

내 최신 환생 오류 선이 표시되지 않습니다. 그것의 어딘가에 잃어버린 것 같은?

+0

이유는 무엇입니까? – marisbest2

+0

왜 다른 곳에서 실행하고 하나의 명령으로 서브 프로세스로 전달할 명령을 작성하고 있습니다. 필자는 명령을 실행 가능 + args로 분할하고 싶지 않으면 shell = True를 사용해야한다는 인상 아래에있었습니다. – John

+0

나는 shell = True를 사용하는 것이 일반적으로 길지 않다는 말을 항상 듣는다. 그것 없이는 작동합니까? – marisbest2

답변

0

알 수 있습니다. 내가 달리고있는 명령을 쌓은 결과였습니다. 명령에는 exe와 args가 한 줄에 포함되었습니다.

command = "testtool.exe -f <filename>" 
proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True) 

이 도구가 실행되었지만, 어떤 이유로 든 내가 기대했던 오류가 발생하지 않았습니다. 다음 스 니펫을 다시 포맷하면 예상했던 오류가 발생합니다.

관련 문제