2009-05-19 7 views

답변

23

당신은 하위 프로세스를 사용하여 파일에 직접 리디렉션 할 수 있습니다 :

3) 다시 기본값으로 표준 출력을 리디렉션해야합니다.

import subprocess 
with open('output.txt', 'w') as output_f: 
    p = subprocess.Popen('Text/to/execute with-arg', 
         stdout=output_f, 
         stderr=output_f) 
7

가장 쉬운 방법은 os.system("the.exe -a >thefile.txt")이지만 다른 많은 방법이 있습니다. 예를 들어 subprocess 모듈을 표준 라이브러리에 사용할 수 있습니다.

+0

어떻게 그 서브 프로세스를 사용합니까? – Kim

+0

http://docs.python.org/library/subprocess.html#replacing-os-system을 참조하십시오. –

+3

os.system을 사용하여 작업을 리디렉션 할 때 운영 체제간에 파이프 기호가 다르다는 것을 기억해야합니다. – mavnn

3

다음과 같이 할 수 있습니다. 예 : 당신이 열려진 비슷한 일을 할 수

p = subprocess.Popen(["ls","-l"],stdout=subprocess.PIPE) 
print p.stdout.read() # or put it in a file 

LS -l의 출력 (또는 다른 명령) 읽기/표준 입력

하지만 알렉스는 파일에 당신은 단지 그것을 원하는 경우 언급 한 바와 같이, 단지 cmd를 리디렉션

파일로 출력

+0

장기간 실행되는 프로세스 인 경우 stdout.read()가 블로킹한다는 점에 유의하십시오. 스크립트가 다른 작업을 계속하거나 '라이브'결과에 응답 할 경우 다른 스레드에서 하위 프로세스를 실행하려고합니다. – mavnn

0

실행 파일을 실행하고 결과를 기다리고 싶다면 Anurag의 해결책이 가장 좋습니다. 도착한 각 출력 라인에 응답해야하고 다음 작업이 수행되었음을 알았습니다.

1) 쓰기 (텍스트) 메소드로 객체를 만듭니다. stdout을 리디렉션 (sys.stdout = obj)합니다. write 메소드에서 도착한 출력을 처리하십시오.

2) 다음과 같은 코드로 별도의 스레드에서 메소드를 실행하면 표준 출력 리디렉션했기 때문에

p = subprocess.Popen('Text/to/execute with-arg', stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE, shell=False) 
    while p.poll() is None: 
     print p.stdout.readline().strip() 

는, 파이프 라인으로 당신의 쓰기 방법 라인에 출력을 보내드립니다. 줄 바꿈을 할 것이라는 확신이 없다면 읽기 (양)도 효과가 있다고 생각합니다. = sys.stdout __sys.stdout__

0

제목 (.exe)은 Windows에서 문제가있는 것처럼 들리지만. 필자는 대답 (stdout/stderr 인수로 subprocess.Popen())을 파이썬 2.7이 설치된 Mac OS X (10.8)에서 작동하지 않는다고 공유해야했습니다.

subprocess.check_output() (python 2.7 이상)을 사용하여 작동하게해야했습니다. 예 : 프로그램이 완료되면이 용액을 모두 적산 출력을 기록하는

import subprocess 

cmd = 'ls -l' 
out = subprocess.check_output(cmd, shell=True) 
with open('my.log', 'w') as f: 
    f.writelines(out) 
    f.close() 

참고. 실행 중에 로그 파일을 모니터링하려는 경우. 다른 것을 시도하고 싶을 수도 있습니다. 내 경우에는 최종 결과 만 신경 썼습니다.

관련 문제