python – 为什么我们必须在subprocess.Popen中使用列表?
作者:互联网
我的问题更具理论性而非实际性,我找到了更多的答案,解释了我们为什么要在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
可能是execve和子进程使用的列表模型有些相关,但任何人都可以给出一个很好的解释吗?
提前致谢.
解决方法:
底层C级表示是一个* char []数组.在Python中将其表示为列表只是一种非常自然且透明的映射.
您可以使用字符串而不是shell = True的列表;然后shell负责将命令行解析为* char []数组.然而,外壳增加了许多讨厌的复杂性;有关详细说明,请参阅why you want to avoid shell=True
的许多问题.
command line arguments argv
and the environment envp
只是许多操作系统级结构中的两个,它们本质上是一个以空字符结尾的字符串数组.
标签:execve,python,subprocess 来源: https://codeday.me/bug/20190824/1705371.html