2017-01-03 4 views
0

ここにコンテキストがあります: 私はpython 2.7.5を使用しています。そして、PythonスクリプトでmavenコマンドだけでなくUNIXコマンドも実行したいと思います。 私はos.system("cmd")を使って成功しましたが、私は与えられたコマンドの結果に取り組む必要があります。ここでdocといくつかのスレッドを読んだあと、サブプロセスモジュールを使用して、PIPEを使用して出力をstdoutにリダイレクトすることにしました。予期しないことに、私は添付の画像に示すようにOSErrorを取得しています。あなたの助けに感謝します。 は、添付された画像では、与えられたサンプルに加えて、私が試してみました:UNIXコマンドを実行しているときにOSErrorを与えるPythonサブプロセスモジュール

p = os.popen("java -version") 
result = subprocess.check_output(p, shell=True) 
subprocess.call("ls /usr", shell=True) 
p.s. Using shell=True is strongly discouraged (doc), since it can be dangerous when coupled with unsanitized input. 

はまた、私はエラーメッセージ/usr/lib64/python2.7/subprocess.py, line 711 adn 1327に指定したスクリプトで見ていたが、中にmentionnedされているものよりも多くを学ぶことがなかったですエラーメッセージ:raise child_exception Subprocess Terminal Output

答えて

1

subprocess.check_outputは正しく使用されていません。パイプファイルオブジェクト(戻り値os.popen)をcheck_outputに渡そうとしていますが、コマンド引数または引数ベクトルが必要です。

また、実行されたコマンドの出力をキャプチャしないので、スクリプトを対話的に実行しているユーザがls /usr(または何でも)の出力を見たい場合にのみ使用します。 (どのはかなりos.systemと同じである。)

は(シェルととせずに示す)の代わりにこれを試してみてください:java -versionコマンドの場合には、バージョン情報がに印刷されることを

import subprocess 

out1a = subprocess.check_output(['java', '-version'], stderr=subprocess.STDOUT) 
print(out1a) 

out1b = subprocess.check_output('java -version', stderr=subprocess.STDOUT, shell=True) 
print(out1b) 

out2a = subprocess.check_output(['ls', '/usr']) 
print(out2a) 

out2b = subprocess.check_output('ls /usr', shell=True) 
print(out2b) 

# Cannot capture output this way, but it will be visible to user 
subprocess.call('ls /usr', shell=True) 

注意をこのコマンドの標準エラー出力は、戻り値としてcheck_output(したがってstderr=subprocess.STDOUT)の値を取得するためにリダイレクトする必要があります。

+0

ありがとうございました。コマンドout1aとその印刷が現在動作しています。しかし、バージョンが特定の番号と一致するかどうかをチェックしたいので、どのようにして最初の行を絞り込むことができますか?出力をfile.txtにリダイレクトしようとしましたが、動作しません。ターミナル出力を直接抽出して処理するのに役立つコマンドがありますか? – Mams

+0

戻った結果は、複数行のテキストを含む文字列です。 'out1a.splitlines()'を使ってそれを個々の行に分解してください。これはあなたが気にするコンポーネントを選択するための 'タプル(tuple) 'を返します。たとえば、 'print(out1a.splitlines()[0])'を試してみてください。次に、他の文字列メソッドを使用して、必要なバージョン番号を分離します(https://docs.python.org/2/library/stdtypes.html?string-methods#string-methodsを参照) –

+0

私の問題を解決するのに役立ちました。再び、Gilに感謝します。インポートのサブプロセス import re res = subprocess.check_output(['java'、 '-version']、stderr = subprocess.STDOUT)res2 = res.splitlines(0).split )[2] のversionNumber = re.findall( '[0-9 ._] +'、RES2) プリント(のversionNumber) のversionNumber場合は[0]> = 1.7: \tプリント他に "クール" : \t print "新しいバージョンをインストールする" – Mams

関連する問題