Pythonスクリプトでシェルコマンドを起動し、終了を待ってスクリプトに戻る

StackOverflow https://stackoverflow.com/questions/325463

質問

ディレクトリ内のすべてのファイルに対してシェルコマンドを起動する必要があるpythonスクリプトがあります:

import os

files = os.listdir(".")
for f in files:
    os.execlp("myscript", "myscript", f)

これは最初のファイルでは正常に機能しますが、「myscript」の後コマンドが終了し、実行が停止し、Pythonスクリプトに戻りません。

どうすればいいですか? os.execlp()を呼び出す前に fork()する必要がありますか?

役に立ちましたか?

解決

  

サブプロセス: subprocess モジュール   新しいプロセスを生成できます。   入力/出力/エラーに接続する   パイプ、およびリターンコードを取得します。

http://docs.python.org/library/subprocess.html

使用法:

import subprocess
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
process.wait()
print process.returncode

他のヒント

subprocess.Popen を使用できます。いくつかの方法があります:

import subprocess
cmd = ['/run/myscript', '--arg', 'value']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in p.stdout:
    print line
p.wait()
print p.returncode

または、外部プログラムが実際に何をするか気にしない場合:

cmd = ['/run/myscript', '--arg', 'value']
subprocess.Popen(cmd).wait()

サブプロセスモジュールは、2008年以来機能しています。特に、 check_call および check_output は、単純なサブプロセスをさらに簡単にします。 check _ * ファミリーの関数は、何か問題が発生した場合に例外を発生させるので便利です。

import os
import subprocess

files = os.listdir('.')
for f in files:
   subprocess.check_call( [ 'myscript', f ] )

myscript によって生成された出力は、プロセスが出力を生成したかのように表示されます(技術的には myscript とPythonスクリプトは同じstdoutを共有します)。これを避けるにはいくつかの方法があります。

  • check_call(['myscript'、f]、stdout = subprocess.PIPE)
    stdoutは抑制されます( myscript が4k以上の出力を生成する場合は注意してください)。オプション stderr = subprocess.PIPE を追加しない限り、stderrは引き続き表示されます。
  • check_output(['myscript'、f])
    check_output はstdoutを文字列として返すため、表示されません。オプション stderr = subprocess.STDOUT を追加しない限り、stderrは引き続き表示されます。

os.exec *()は、現在のプログラムを新しいプログラムに置き換える関数です。このプログラムが終了すると、プロセスも終了します。おそらく os.system()が必要でしょう。

spawnを使用

import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')

os.systemを使用

import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))

これでうまくいきました!

shell_command =" ls -l" subprocess.call(shell_command.split())

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top