モジュールを使用してさまざまなプロセスを呼び出していますsubprocess
。ただし、質問があります。
次のコードでは:
callProcess = subprocess.Popen(['ls', '-l'], shell=True)
そして
callProcess = subprocess.Popen(['ls', '-l']) # without shell
どちらも動作します。ドキュメントを読んだ後、シェルを介してコードを実行することを意味することがわかりましたshell=True
。つまり、存在しない場合は、プロセスが直接開始されることを意味します。
では、私の場合はどちらを優先すべきでしょうか。プロセスを実行してその出力を取得する必要があります。シェル内から呼び出すか、シェル外から呼び出すかによって、どのような利点があるのでしょうか。
ベストアンサー1
シェル経由で呼び出さないことの利点は、「謎のプログラム」を呼び出さないことです。POSIX では、環境変数によって「SHELL
シェル」として呼び出されるバイナリが制御されます。Windows では、Bourne Shell の派生プログラムはなく、cmd.exe のみがあります。
したがって、シェルを呼び出すと、ユーザーが選択したプログラムが呼び出され、プラットフォームに依存します。一般的に、シェル経由の呼び出しは避けてください。
シェル経由で呼び出すと、シェルの通常のメカニズムに従って環境変数とファイル グロブを展開できます。POSIX システムでは、シェルはファイル グロブをファイルのリストに展開します。Windows では、ファイル グロブ (例: "*.*") はシェルによって展開されません (ただし、コマンド ラインの環境変数はcmd.exe によって展開されます)。
環境変数の拡張とファイル グロブが必要と思われる場合は、シェル経由でサブプログラム呼び出しを実行するネットワーク サービスに対する 1992 年頃の攻撃を調べてください。例には、に関連するさまざまなバックドアILS
が含まれます。sendmail
ILS
要約すると、 を使用しますshell=False
。