2012-04-16 11 views
0

こんにちは私は次のコマンドを使用してPythonからシェルスクリプトを実行しようとしています。私のシェルスクリプトでPythonで実行しているシェルスクリプトの出力をリダイレクト

os.system("sh myscript.sh") 

は私が書かれているいくつかのSOPさん、今どのように私はPythonでSOPのは、私はいくつかのファイルにそれらをログに記録できるように入手できますか?

私は使用していることを知っていますsubprocess.Popen私はそれを行うことができます、何らかの理由で私はそれを使用することはできません。

p=subprocess.Popen(
     'DMEARAntRunner \"'+mount_path+'\"', 
     shell=True, 
     stdout=subprocess.PIPE, 
     stderr=subprocess.STDOUT 
) 
while 1: 
    line=p.stdout.readline()[:-1] 
    if not line: 
     break 
    write_to_log('INFO',line) 
    p.communicate() 
+0

あなたは本当にその種のコマンドにシェルを使用したくない... – ThiefMaster

+0

PIPEの代わりに 'stdout = some_file_like_object'を設定してみませんか?コマンドの出力を標準ストリームで見る必要がありますか? – jadkik94

答えて

1

私は個人的にFalseのデフォルト値でshell引数を残すためにあなたを助言します。その場合、最初の引数は、端末に入力する文字列ではなく、単語のリストです。最初はプログラム、それ以降は引数です。つまり、引数を引用する必要はなく、プログラムを空白引数よりも弾力性があり、injection attacksにすることができます。いつものようにシェルを実行すると、質問をコマンドで

p = subsprocess.Popen(['DMEARAntRunner', mount_path], 
    stdout=subprocess.PIPE,stderr=subprocess.STDOUT) 

、それは問題を解決する最も簡単な/最良の方法だが、それは全く別の議論だかのまま:

この

は、トリックを行う必要があります。

+0

つまり、シェル= Falseメソッドは、セキュリティ、パフォーマンス、および正確さの点で特に優れています。このため、デフォルト値はFalseです。 – bukzor

+0

ああ、私はそれを逃した。いい視点ね。私は、シェルのないフォームが優れていて、使用するのがはるかに簡単であることに同意します(醜い引用やその他のものはありません)。 – MaienM

+0

あなたは正しいのですが、壊れたコードを残しておけば、誰にも利益をもたらすことはありません。一定。 – MaienM

1

これは、official documentationのpythonでサブプロセスモジュールを使用していることを確認してください。これは現在、システム関数を実行して結果を取得するために、os.system呼び出しに対して推奨される方法です。上記のリンクは、必要なものに非常に近い例を示しています。

0

私が正しくあなたの質問を理解していれば、あなたはこのような何かをしたい:

import subprocess 
find_txt_command = ['find', '-maxdepth', '2', '-name', '*.txt'] 
with open('mylog.log', 'w') as logfile: 
    subprocess.call(find_txt_command, stdout=logfile, shell=False) 

あなたがする必要がある場合、構文は非常に似ている代わりに、コールのpopenのを使用することができます。 commandは、実行するプロセスと引数を含むリストであることに注意してください。一般的に、Popen/callをshell = Falseで使いたい場合、デバッグが難しい予期しない動作を防止し、移植性を向上させます。

関連する問題