ホームページ  >  記事  >  バックエンド開発  >  Python を使用してシェル スクリプトを実行し、パラメータとサブプロセスの基本的な使用法を動的に転送します

Python を使用してシェル スクリプトを実行し、パラメータとサブプロセスの基本的な使用法を動的に転送します

不言
不言オリジナル
2018-04-26 14:47:594902ブラウズ

この記事では、Python を使用してシェル スクリプトを実行し、パラメーターを動的に転送する方法と、サブプロセスの基本的な使用方法について説明します。興味のある方はぜひご覧ください。私は最近、作業要件でこの状況に遭遇しました。 Web 側 そして、シェル スクリプトに動的にパラメータを渡します

シェル スクリプトを実行する方法はたくさんありますが、最後に、Python 標準ライブラリである subprocess を選択しました

subprocess モジュールは、子プロセスを開始してその入出力を制御することが非常に便利です。

Class Popen (ARGS, BUFSIZE = 0, Executable = None,

Stdin = None, Stdout = None, Stiderr = None,

Prexec_fn = None, CLOSE_FDS = FALSE CWD = None, ENV = None, universal_newlines = False,
startupinfo = なし、作成フラグ = 0):
パラメータは次のとおりです:
args は文字列、または一連のプログラム パラメータである必要があります。実行するプログラムは通常、引数シーケンスまたは文字列の最初の項目ですが、実行可能な引数を使用して明示的に設定できます。
UNIX の場合、shell=False (デフォルト): この場合、POPEN クラスは os.execvp() を使用してサブルーチンを実行します。 args は通常、シーケンスである必要があります。文字列は、一意の項目 (実行されるプログラム) として文字列のシーケンスとして扱われます。


UNIX の場合、shell=True の場合: args が文字列の場合、シェル経由で実行されるコマンド文字列を指定します。 args がシーケンスの場合、最初の項目はコマンド文字列を指定し、その他の項目は追加のシェル引数として扱われます。

最初に簡単なシェルスクリプトを作成できます a.sh

$1 $2 は、それぞれスクリプトに渡される最初と二番目のパラメータを表します

shell=Trueを書かない場合、デフォルトはshell=Falseです、実行プログラムのパスは args の最初のパラメータで指定する必要があります


bufsize 指定された場合、bufsize は組み込み open() 関数の対応するパラメータと同じ意味を持ちます: 0 はバッファリングなしを意味します, 1 行バッファリングを表します。その他の正の値は、(ほぼ) そのサイズのバッファーを使用することを意味します。負の bufsize はシステムのデフォルトを使用することを意味し、通常はフルバッファリングを意味します。 bufsize のデフォルト値は 0 (バッファリングなし) です。

stdin、stdout、stderr はそれぞれ、実行されるプログラムの標準入力、標準出力、標準エラーのファイル ハンドルを指定します。有効な値は、PIPE、既存のファイル記述子 (正の整数)、既存のファイル オブジェクト、および None です。 PIPE は、子に対して新しいパイプを作成する必要があることを示します。 None を指定すると、リダイレクトは行われません。子のファイル ハンドルは親クラスから継承されます。または、stderr を STDOUT にすることもできます。これは、アプリケーションの stderr データが stdout と同じファイル ハンドルにキャプチャされる必要があることを示します。


Popen オブジェクトでは、値 subprocess.stdout=PIPE を設定できます。つまり、パイプ p.stdout.read() を通じてプロセスの標準出力を取り出すことができます。呼び出し可能なオブジェクトの場合、オブジェクトは子プロセスが実行される前に Called になります。

close_fds が true の場合、0、1、2 を除くすべてのファイル記述子は子プロセスを実行する前に閉じられます。


shell が true の場合、指定されたコマンドはシェルを通じて実行されます。


cwd が None でない場合、子を実行する前に現在のディレクトリが cwd に変更されます。


env が None でない場合、新しいプロセスの環境変数が定義されます。


universal_newlines が true に設定されている場合、ファイル オブジェクト stdout および stderr はテキスト ファイルとして開かれますが、Unix の行末規則である n、Macintosh の規則、または Windows の規則である n の任意の行末尾が含まれる場合があります。 。これらの外部表現はすべて、Python プログラムによって n として扱われます。注: この機能は、Python がユニバーサル改行サポート (デフォルト) を使用して構築されている場合にのみ使用できます。さらに、ファイル オブジェクト stdout、stdin、および stderr の改行プロパティは communication() メソッドによって更新されません。




STARTUPINFO と作成フラグが設定されている場合、それらは基礎となる CreateProcess() 関数に渡されます。メイン ウィンドウの外観や新しいプロセスの優先順位などを指定できます。 (Windows のみ)



Popen オブジェクトの一部のメソッド

Popen.poll() 子プロセスが終了したかどうかを確認し、オブジェクトのリターンコードを返す


Popen.wait() 子プロセスが完了するのを待つ、ブロックします。 Return returncode

Popen.communicate(input=None) プロセスに情報を入力し、ファイルの終わりに達するまで stdout と stderr からデータを読み取ります。プロセスが終了するまで待ちます。オプションの stdin 引数は、子プロセスに送信される文字列であるか、子プロセスにデータが送信されない場合は None である必要があります。

タプル(stdout、stderr)を返しますが、読み込んだデータはメモリにキャッシュされるため、データ量が大きい場合や無限の場合はこのメソッドを使用しないでください

popen.pid子プロセスのPID

POPEN.RETURNCODEは、まだ終了していません


Popen.kill() はプロセスを強制終了します

関連する推奨事項:

疑問を解決するために Python シェルに基づいてホスト名と FQDN を取得します

bpython 強力な Python シェル

以上がPython を使用してシェル スクリプトを実行し、パラメータとサブプロセスの基本的な使用法を動的に転送しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。