2012-05-01 6 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を検証する必要があり、個々のアウトアウトを個別にチェックできるはずです。

ヘルプ?で解決

:あなたは間違いなく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

haha​​。私は '2>&1'を試してみました。うまくいきました。私の質問をソリューションで編集して戻したいと思っていました。あなたは同じ提案をしていました。ありがとう:-)ガレージ。 – madCode

+0

あなたは大歓迎です! –

答えて

3

は、これはあなたがSTDOUTSTDERRを区別することができます。また、リターンコードを確認することができます。さらに、それはアプリケーションを開始するための好ましい方法です。

p = subprocess.Popen(['xmllint', '--noout', '--dtdvalid', path], stdout=PIPE, stderr=PIPE) 
print p.communicate() 
関連する問題