BashスクリプトでPythonとbashコマンドの両方を実行しようとしています。bashスクリプトでは、Pythonループで囲まれたいくつかのbashコマンドを実行します:
#!/bin/bash
python << END
for i in range(1000):
#execute some bash command such as echoing i
END
これどうやってするの?
サブプロセス を使用します。例:
import subprocess
# ...
subprocess.call(["echo", i])
subprocess.call
:subprocess.check_call
のような別の関数があります。実行されたコマンドがゼロ以外の終了コードで返された場合に例外をスローするだけで、呼び出しとまったく同じです。これは、多くの場合、スクリプトおよびユーティリティで実行可能な動作です。
subprocess.check_output
はcheck_call
と同じ動作をしますが、プログラムの標準出力を返します。
シェル機能(変数展開、ワイルドカードなど)が必要ない場合は、Shell = Trueを使用しないでください(Shell = Falseがデフォルトです)。 If Shell = Trueを使用すると、シェルエスケープがこれらの機能を備えた仕事であり、未検証のユーザー入力が渡されるとセキュリティホールになります。
同じことがos.system()にも当てはまります。これは、セキュリティの問題の頻繁な原因です。使用しないでください。
subprocess モジュールに注目してください。 Popenメソッドと、call
などのラッパー関数があります。
出力を確認する必要がある場合(結果の文字列を取得する):
output = subprocess.check_output(args ....)
続行する前に実行が終了するのを待ちたい場合:
exitcode = subprocess.call(args ....)
環境変数の設定などの機能が必要な場合は、基礎となるPopenコンストラクターを使用します。
subprocess.Popen(args ...)
サブプロセスは上位モジュールであることを忘れないでください。 OSモジュールのレガシー機能を置き換える必要があります。
IDE(PyCharm)から実行するときにこれを使用しました。
import subprocess
subprocess.check_call('mybashcommand', Shell=True)