2010-07-07 3 views
7

보통 sys.stdout의 값을 변경하여 파이썬에서 stdout을 변경할 수 있습니다. 그러나 이것은 단지 print 문장에 영향을주는 것으로 보입니다. 그렇다면, 콘솔에서 출력되는 내용을 파이썬에서 os.system() 명령을 통해 실행하는 것을 억제 할 수있는 방법이 있습니까?Python에서 os.system()의 명령에서 stdio를 리디렉션

답변

14

subprocess.PIPE 통신을 통해 subprocess.Popen을 통해 프로그램을 실행 한 다음 원하는대로 출력을 밀어 넣을 수는 있지만, 그대로 os.system 만 실행하면됩니다.

from subprocess import Popen, PIPE 

p = Popen(['command', 'and', 'args'], stdout=PIPE, stderr=PIPE, stdin=PIPE) 

output = p.stdout.read() 
p.stdin.write(input) 

내 의견에는 훨씬 더 유연합니다. 당신은 전체 설명서를보고 할 수 있습니다 : Python Subprocess module

+0

음 ... 알았어. 명령이 P = Popen (...) 선에서 실행되는 것보다 그렇습니까? 그리고 p.stdout.read()를 호출 할 때 출력 만 표시합니다 ... 그렇습니까? 고마워요 –

+0

알겠습니다 ... 명령이 실행되었지만 별도의 스레드에서 실행되었습니다. 명령이 실행되는 동안 프로그램을 멈추거나 동일한 스레드에 유지할 수 있습니까? 고맙습니다. –

+2

단순히 p.wait()를 사용하십시오. 그러나 프로그램이 충분한 출력을 생성하는 경우 PIPE stdout을 사용할 때 교착 상태가 발생할 수 있습니다. http://docs.python.org/library/subprocess.html#subprocess.Popen.wait에서 전체 설명서를 참조하십시오. 그러나, 나는 그것이 작동해야한다고 생각합니다. –

0

stderr 및 stdout을 리디렉션합니다.

+1

http://docs.python.org/library/os.html#process-management os.system을 (명령)에서 작업 견적을하지 않는다 서브 쉘에서 명령 (문자열)을 실행하십시오. 이것은 표준 C 함수 시스템()을 호출하여 구현되며 동일한 제한이 있습니다. sys.stdin 등의 변경 사항은 실행 된 명령의 환경에 반영되지 않습니다. –

12

unix 시스템에서는 stderr 및 stdout을 명령 자체의 일부로/dev/null로 리디렉션 할 수 있습니다.

os.system(cmd + "> /dev/null 2>&1") 
+1

유닉스 시스템에서만 작동합니다. –

+0

예, 정확합니다. 혼란을 피하기 위해 답변이 업데이트되었습니다. – ealdent

0

파이썬 프로그램으로 시작되는 콘솔을 완전히 제거하려면 .pyw 확장명으로 저장할 수 있습니다.

내가 오해 할 수도 있습니다.