2009-10-21 2 views
1

나는 유니슨을 통해 자동화 및 로그 기록을위한 간단한 스크립트를 만들려고합니다. subprocess.Popen을 사용하고 있습니다. 일반적인 os.system 호출보다는 deprecated입니다. 나는 지난 2 일 동안 문서를보고, 내가 뭘 잘못하고 있는지 알아 내려고했지만, 어떤 이유에서든 터미널에서 조화를 호출하면 아무 문제가 없지만, 파이썬에서 같은 호출을 할 때 사용자 상호 작용을 시도하지만 추가로 캡처하지는 않지만 출력의 약 절반은 여전히 ​​터미널에 인쇄 중입니다. 여기 스크립팅 문제 Python과 유니슨

내 코드는 내가 사용하는 것을 시도하고있다 :

여기
sync = Popen(["unison", "sync"], shell = True, stdout = PIPE) 

for line in sync.stdout 
    logFile.write(line) 

sync.wait() 

if sync.returncode == 0 or sync.returncode == None: 
    logFile.write("Sync Completed Successfully\n") 
else 
    logFile.write("!! Sync Failed with a returncode of: " + str(sync.returncode) + "\n") 

내 유니슨 설정 파일입니다 :

root = /home/zephyrxero/temp/ 
root = /home/zephyrxero/test/ 

auto = true 
batch = true 
prefer = newer 
times = true 
owner = true 
group = true 
retry = 2 

내가 무슨 일을하고 있는가? 왜 유니슨의 모든 출력물이 내 로그 파일에 저장되지 않고, 스크립트가 실행될 때 확인 메시지를 표시하는 이유는 무엇입니까?하지만 터미널에서 평범하게 실행하지 않는 이유는 무엇입니까?

UPDATE : 에밀에 좋아, 덕분에 지금은 모든 출력을 캡처 합니다만,에서를 호출 할 때와는 다른 결과를 얻고있다 터미널에 "한마음 동기화"를 입력 내가 왜 아직 알아낼 ​​수 없습니다 내 스크립트.

답변

1

가장 큰 원인은 일치가 stdout 대신 stderr에 출력을 보내는 것입니다. Popen은 추가 stderr 인수를 취하므로 stdout 대신 (또는 stdout에 추가로) 캡처 할 수 있습니다.

standard streams에 대한 빠른 참조는 Wikipedia을 참조하십시오.

+0

필자는 이전에 파이핑 표준을 시험해 보았지만 어떤 이유로 작동하지 않는 것 같았습니다 ... 입력을 기다리고 있다고 생각하기 전에 ... 흠 ... 모든 출력을 캡처 한 것 같습니다 지금. –

0

[ "unison", "sync"]를 단순한 [ "unison sync"]로 변경했습니다 ... 지금 사용자 상호 작용없이 작동하고있는 것 같습니다. 다른 이유는 무엇인지 모르겠지만 ... 나를.