2012-05-01 2 views
0

os.system 및 os.popen에서이 명령의 출력을 캡처하려고했지만 실패했습니다. 콘솔에서 출력을 던지지 않고 출력을 데이터 구조 또는 파일로 캡처하여 추가로 확인하고 처리하도록 명령을 중지하려고합니다. xmllint라는 간단한 도구를 사용하고 있습니다. 나는python에서 도구를 사용하여 xml 유효성 검사 - 출력 수집

1. p = os.popen('xmllint --noout --relaxng /home/xxxxx_id/folder_xx/xxxx/xxx/rngfile.rng /home/xxxxx_id/folder_xx/xxxx/xxx/xxx/the_xmlfile_that_needstobe_validated.xml') 

2. os.system('xmllint --noout --dtdvalid ' + path to the xml + '> xmloutput') 

모두 실패 보인다 파일이나 데이터 구조로 그것을 복사하는 대신 내 콘솔에 출력을 제공을 시도했다. 나는 100 개 이상의 xml을 검증 할 필요가 있고 각 아웃 아웃을 개별적으로 확인할 수 있어야한다.

도움 말? 당신은 definitly subprocess를 사용해야합니다

os.system('xmllint --noout --dtdvalid ' + path to the xml + '> xmloutput 2>&1') 
+1

'xmllint'은 아마 진단 출력을 보내는 파스 트리 자사의 덤프 별도로 "표준 오류"에 당신이 --noout''사용 억제 한 "표준 출력"로 설정합니다. 접근법 2에서 명령 끝에 "2> & 1"을 넣으십시오. 또는 진단 출력이 다른 파일 ("2> somewhereelse.txt")로 이동하게하려면 (따옴표없이) 접근법 1의 경우, 실제로는 현재'subprocess' 모듈을 사용해야합니다. 표준 출력 및 표준 오류로 원하는대로 할 수 있습니다. –

+0

하하. 나는 '2> & 1'을 시도하고 효과가 있었고, 해결책으로 내 질문을 편집하고 싶었고 동일한 제안을했습니다. 고마워 :-) 가레 스. – madCode

+0

여러분을 환영합니다! –

답변

3

, 이것은 당신이 STDOUTSTDERR 구별 할 수 있으며, 당신은 또한 리턴 코드를 확인할 수 있습니다

함께 해결. 더 나아가 응용 프로그램을 시작하는 것이 좋습니다.

p = subprocess.Popen(['xmllint', '--noout', '--dtdvalid', path], stdout=PIPE, stderr=PIPE) 
print p.communicate()