【发布时间】:2015-08-30 02:11:22
【问题描述】:
似乎每当我尝试使用 Python 的 subprocess 模块时,我发现我仍然不明白一些东西。目前,我正在尝试从 Python 模块中加入 3 个 mp4 文件。
当我尝试时
z ='MP4Box -cat test_0.mp4 -cat test_1.mp4 -cat test_2.mp4 -new test_012d.mp4'
subprocess.Popen(z,shell=True)
一切正常。
当我尝试时
z = ['MP4Box', '-cat test_0.mp4', '-cat test_1.mp4', '-cat test_2.mp4', '-new test_012d.mp4']
subprocess.Popen(z,shell=False)
我收到以下错误:
Option -cat test_0.mp4 unknown. Please check usage
我认为对于shell=False,我只需要提供一个列表,其中第一个元素是我想要运行的可执行文件,每个后续元素都是该可执行文件的参数。我的这种看法是错误的,还是有正确的方法来创建我想使用的命令?
另外,在 subprocess.Popen 中使用Shell=True 有什么规则吗?到目前为止,我真正知道的(?)是“不要这样做 - 你可以将你的代码暴露给 Shell 注入攻击”。为什么Shell=False 会避免这个问题?使用 'Shell=True` 有实际优势吗?
【问题讨论】:
-
尝试使用
shlex.split正确标记arg,如here 中的示例 -
@Ami Tavory - 谢谢,我认为这确实回答了我的问题。但是,可以肯定的是,当
shell=True时,shell 程序将解析 cmd 字符串。因为 shell 程序是非常通用的,所以它会接受和执行比我预期的要多得多的命令,因为它可能意味着只处理一个非常特定的命令及其选项。shell=False和 shlex 的使用将执行的字符串集限制为更接近我的特定用例。这是正确的理解吗?
标签: python shell subprocess