4

私の質問は実用的というよりも理論的なものです。呼び出しでリストを使用する理由ではなく、方法を説明する回答がさらに見つかりました。subprocess.Popen

たとえば、知られているように:

Python 2.7.10 (default, Oct 14 2015, 16:09:02)
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> cmd = subprocess.Popen(["python", "-V"], stdout=subprocess.PIPE)
Python 2.7.10

次に、UNIX をいじっていて、興味深いものを見つけました。

mvarge@ubuntu:~$ strace -f python -V 2>&1
execve("/usr/bin/python", ["python", "-V"], [/* 29 vars */]) = 0

おそらく両方execvesubprocess使用するリストモデルは何らかの形で関連していますが、誰かがこれについて良い説明をすることができますか?

前もって感謝します。

4

2 に答える 2

3

基礎となる C レベルの表現は*char []配列です。これを Python でリストとして表現することは、非常に自然で透過的なマッピングです。

shell=True;を使用すると、リストの代わりに文字列を使用できます。シェルは、コマンドラインを* char []配列に解析する役割を果たします。ただし、シェルには厄介な複雑さがいくつか追加されます。詳細な説明については、なぜ回避したいshell=Trueのかについての多くの質問を参照してください。

コマンド ライン引数argvと環境envpは、多くの OS レベルの構造のうちの 2 つにすぎません。これらの構造は、本質的に null で終わる文字列の配列です。

于 2016-03-31T12:11:16.490 に答える