subprocess モジュールのドキュメントには、「シェルが True の場合、指定されたコマンドがシェルを通じて実行される」と記載されています。これは実際には、Windows OS 上で何を意味するのでしょうか?
4 に答える
COMSPEC
これは、環境変数で指定されたプログラムを使用してコマンドが実行されることを意味します。通常cmd.exe
。
正確には、subprocess はCreateProcess
Windows API 関数を呼び出し、引数"cmd.exe /c " + args
として渡します。lpCommandLine
shell==False の場合、lpCommandLine
CreateProcess への引数は単にargs
です。
外部プロセスを実行すると、必要なコマンドは「fooarg1arg2arg3」のようになります。「foo」が実行可能ファイルの場合、それが実行され、引数が与えられます。
ただし、多くの場合、「foo」は実際にはある種のスクリプトであるか、ディスク上の実際の実行可能ファイルではなく、シェルに組み込まれているコマンドである可能性があります。この場合、厳密に言えば、これらの種類のものは実行可能ではないため、システムは「foo」を直接実行できません。それらを実行するには、ある種の「シェル」が必要です。* nixシステムでは、このシェルは通常(必ずしもそうとは限りませんが)/ bin/shです。Windowsでは、通常はcmd.exe(またはCOMSPEC環境変数に格納されているもの)になります。
このパラメーターを使用すると、コマンドの実行に使用するシェルを定義できます。デフォルトが不要な比較的まれなケースです。
他の回答で述べたことに加えて、そのファイルタイプのデフォルトのビューアでファイルを開く場合は、実際に役立ちます。たとえば、HTML または PDF ファイルを開きたいが、それが実行されるシステムにインストールされているブラウザーまたはビューアーがわからない場合、または実行可能ファイルへのパスに関する保証がない場合は、単にargs フィールドの唯一の引数としてファイル名を指定する場合は、shell=True を設定します。これにより、Windows はそのファイル タイプに関連付けられているプログラムを使用します。ファイルへのパスにスペースが含まれている場合は、2 つの ".
例えば。
path = "C:\\Documents and Settings\\Bob\\Desktop\\New Folder\\README.txt"
subprocess.call('""' + path + '""', shell = True)