web-dev-qa-db-ja.com

Pythonスクリプト内でbashコマンドを実行する方法

BashスクリプトでPythonとbashコマンドの両方を実行しようとしています。bashスクリプトでは、Pythonループで囲まれたいくつかのbashコマンドを実行します:

#!/bin/bash

python << END
for i in range(1000):
    #execute‬ some bash command such as echoing i
END

これどうやってするの?

22

サブプロセス を使用します。例:

import subprocess
# ...

subprocess.call(["echo", i])

subprocess.callsubprocess.check_callのような別の関数があります。実行されたコマンドがゼロ以外の終了コードで返された場合に例外をスローするだけで、呼び出しとまったく同じです。これは、多くの場合、スクリプトおよびユーティリティで実行可能な動作です。

subprocess.check_outputcheck_callと同じ動作をしますが、プログラムの標準出力を返します。


シェル機能(変数展開、ワイルドカードなど)が必要ない場合は、Shell = Trueを使用しないでください(Shell = Falseがデフォルトです)。 If Shell = Trueを使用すると、シェルエスケープがこれらの機能を備えた仕事であり、未検証のユーザー入力が渡されるとセキュリティホールになります。

同じことがos.system()にも当てはまります。これは、セキュリティの問題の頻繁な原因です。使用しないでください。

39
dom0

subprocess モジュールに注目してください。 Popenメソッドと、callなどのラッパー関数があります。

  • 出力を確認する必要がある場合(結果の文字列を取得する):

    output = subprocess.check_output(args ....)
    
  • 続行する前に実行が終了するのを待ちたい場合:

    exitcode = subprocess.call(args ....)
    
  • 環境変数の設定などの機能が必要な場合は、基礎となるPopenコンストラクターを使用します。

    subprocess.Popen(args ...)
    

サブプロセスは上位モジュールであることを忘れないでください。 OSモジュールのレガシー機能を置き換える必要があります。

17
user3058846

IDE(PyCharm)から実行するときにこれを使用しました。

import subprocess

subprocess.check_call('mybashcommand', Shell=True)
0
Ger Mc