web-dev-qa-db-ja.com

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

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

_import os

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

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

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

53
Davide Gualano

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

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

使用法:

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

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()
60
Harley Holcombe

サブプロセスモジュールは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スクリプトは同じ標準出力を共有します)。これを回避する方法の。

  • 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は引き続き表示されます。
12
deft_code

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

7
unbeknown

スポーンを使用する

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

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

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

0
Pankaj Kabra

Os.systemを使用します

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