我的问题更具理论性而非实际性,我找到了更多的答案,解释了我们为什么要在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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。