1

こんにちは私は次のコマンドを使用して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()
4

3 に答える 3

2

私があなたの質問を正しく理解しているなら、あなたはこのようなものが欲しいです:

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を使用できます。構文は非常に似ています。コマンドは、実行するプロセスと引数のリストであることに注意してください。一般に、shell=FalseでPopen/callを使用すると、デバッグが困難になる可能性のある予期しない動作が防止され、移植性が向上します。

于 2012-04-16T16:27:29.023 に答える
2

shell個人的には、引数をデフォルト値の のままにしておくことをお勧めしますFalse。その場合、最初の引数は端末に入力するような文字列ではなく、「単語」のリストです。最初の引数はプログラムで、その後の引数は引数です。これは、引数を引用する必要がないことを意味し、空白引数やインジェクション攻撃に対するプログラムの回復力を高めます。

これでうまくいくはずです:

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

いつものように、シェル コマンドを実行する場合は、それが問題を解決するための最も簡単で最善の方法であるかどうかという問題が残りますが、それはまったく別の議論です。

于 2012-04-16T16:08:26.387 に答える
2

Python で subprocess モジュールを使用するこの公式ドキュメントを確認してください。現在、システム関数を実行して結果を取得するには、os.system 呼び出しよりも推奨される方法です。上記のリンクは、必要なものに非常に近い例を示しています。

于 2012-04-16T16:21:11.443 に答える