77

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

import os

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

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

どのようにできるのか?fork()前にする必要がありcalling os.execlp()ますか?

4

7 に答える 7

120

subprocess: このsubprocessモジュールを使用すると、新しいプロセスを生成し、入力/出力/エラー パイプに接続して、リターン コードを取得できます。

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

使用法:

import subprocess
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
process.wait()
print process.returncode
于 2008-11-28T10:48:18.900 に答える
65

使用できます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-11-28T11:01:45.270 に答える
13

サブプロセスモジュールは2008年から登場しています。特にcheck_callcheck_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は抑制されます(myscript4kを超える出力を生成する場合は注意してください)。オプションを追加しない限り、stderrは引き続き表示されますstderr=subprocess.PIPE
  • check_output( [ 'myscript', f ] )
    check_outputstdoutを文字列として返すため、表示されません。オプションを追加しない限り、stderrは引き続き表示されますstderr=subprocess.STDOUT
于 2011-03-03T18:29:29.257 に答える
7

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

于 2008-11-28T10:45:23.150 に答える
3

スポーンを使う

import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')
于 2008-11-28T10:58:10.987 に答える