ホームページ >バックエンド開発 >Python チュートリアル >Pythonでコマンドを実行する3つの方法のまとめ
現在、私が使用しているPythonでcmdを実行する方法は3つあります:
1. os.system("cmd")を使用します
特徴は、実行すると、プログラムがLinuxでのcmd実行に関する情報を出力することです。
import os os.system("ls")
2. Popen モジュールを使用して新しいプロセスを生成します
現在、ほとんどの人が Popen を使用することを好みます。 Popen メソッドは、Linux での cmd 実行に関する情報を出力しません。実際、Popen は非常に強力で、さまざまなパラメータやモードをサポートしています。使用する前に、サブプロセスインポート Popen、PIPE が必要です。しかし、Popen 関数には欠点があります。それは、これがブロックメソッドであるということです。 cmd の実行時に大量のコンテンツが生成されると、関数は簡単にブロックされる可能性があります。解決策は wait() メソッドを使用しないことですが、実行の戻り値を取得できません。
Popen プロトタイプは:
subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False,shell=False, cwd=None, env=None、universal_newlines=False、startupinfo=None、creationflags=0)
パラメータ bufsize: バッファを指定します。
パラメータexecutableは、実行可能プログラムを指定するために使用されます。通常、args パラメータを使用して、実行するプログラムを設定します。シェル パラメータが True に設定されている場合、実行可能ファイルはプログラムで使用されるシェルを指定します。 Windows プラットフォームでは、デフォルトのシェルは COMSPEC 環境変数によって指定されます。
パラメータ stdin、stdout、および stderr は、それぞれプログラムの標準入力、出力、およびエラー ハンドルを表します。これらは PIPE、ファイル記述子、またはファイル オブジェクトにすることも、None に設定して親プロセスから継承することもできます。
パラメータ preexec_fn は Unix プラットフォームでのみ有効で、子プロセスが実行される前に呼び出される呼び出し可能オブジェクトを指定するために使用されます。
パラメータ Close_sfs: Windows プラットフォームでは、close_fds が True に設定されている場合、新しく作成された子プロセスは、親プロセスの入力、出力、およびエラー パイプを継承しません。 close_fds を True に設定して、子プロセスの標準入力、出力、およびエラー (stdin、stdout、stderr) をリダイレクトすることはできません。
パラメータshellがtrueに設定されている場合、プログラムはシェルを通じて実行されます。
パラメータ cwd は、子プロセスの現在のディレクトリを設定するために使用されます。
パラメータ env は辞書型で、子プロセスの環境変数を指定するために使用されます。 env = None の場合、子プロセスの環境変数は親プロセスから継承されます。
パラメータ Universal_newlines: オペレーティング システムが異なると、テキストの改行が異なります。たとえば、Windows では置換を示すために「/r/n」が使用されますが、Linux では「/n」が使用されます。このパラメータが True に設定されている場合、Python はこれらの改行文字を「/n」として扱います。
パラメータstartupinfoおよびcreationflagsは、ウィンドウ下でのみ有効であり、メインウィンドウの外観、プロセスの優先度などの子プロセスの属性を設定するために、基礎となるCreateProcess()関数に渡されます。 。
subprocess.PIPE
Popen オブジェクトを作成するとき、subprocess.PIPE は、サブプロセスとの通信の標準ストリームを表す stdin、stdout、または stderr パラメーターを初期化できます。
subprocess.STDOUT
Popen オブジェクトの作成時に、標準出力ストリームを通じてエラーが出力されることを示す stderr パラメーターを初期化するために使用されます。
Popenメソッド:
Popen.poll()
は、子プロセスが終了したかどうかを確認するために使用されます。 returncode 属性を設定して返します。
Popen.wait()
子プロセスが終了するまで待ちます。 returncode 属性を設定して返します。
Popen.communicate(input=None)
子プロセスと対話します。データを標準入力に送信するか、標準出力および標準エラー出力からデータを読み取ります。オプションのパラメーター入力では、子プロセスに送信されるパラメーターを指定します。 Communicate() はタプル (stdoutdata, stderrdata) を返します。注: stdin を介してプロセスにデータを送信する場合は、Popen オブジェクトの作成時にパラメータ stdin を PIPE に設定する必要があります。同様に、stdout および stderr からデータを取得する場合は、stdout および stderr を PIPE に設定する必要があります。
Popen.send_signal(signal)
子プロセスにシグナルを送信します。
Popen.terminate()
子プロセスを停止します。 Windows プラットフォームでは、このメソッドは Windows API TerminateProcess() を呼び出して子プロセスを終了します。
Popen.kill()
子プロセスを強制終了します。
Popen.stdin
Popen オブジェクトの作成時にパラメータ stdin が PIPE に設定されている場合、Popen.stdin は子プロセスが指示を送信するためのファイル オブジェクトを返します。それ以外の場合は、None が返されます。
Popen.stdout
Popen オブジェクトの作成時にパラメータ stdout が PIPE に設定されている場合、Popen.stdout は子プロセスが指示を送信するためのファイル オブジェクトを返します。それ以外の場合は、None が返されます。
Popen.stderr
Popen オブジェクトの作成時にパラメータ stdout が PIPE に設定されている場合、Popen.stdout は子プロセスが指示を送信するためのファイル オブジェクトを返します。それ以外の場合は、None が返されます。
Popen.pid
子プロセスのプロセスIDを取得します。
Popen.returncode
プロセスの戻り値を取得します。プロセスが終了していない場合は、None を返します。
例:
p = Popen("cp -rf a/* b/", shell=True, stdout=PIPE, stderr=PIPE) p.wait() if p.returncode != 0: print "Error." return -1
3. Commands.getstatusoutput メソッドを使用します
このメソッドは、Linux での cmd の実行に関する情報を出力しません。この方法の唯一の利点は、ブロッキング方法ではないことです。つまり、Popen 機能のブロックの問題は発生しません。使用する前にインポートコマンドが必要です。
例:
status, output = commands.getstatusoutput("ls")
出力とステータスのみを取得するメソッドもあります:
commands.getoutput("ls") commands.getstatus("ls")