在大多数answers(我发现)问题“如何运行外部命令”中我看到了一些内容
如果您想运行
ls -l
,则需要使用subprocess.call(["ls", "-l"])
当我知道将要运行的是我通常会做的是调用subprocess.call('ls -l'.split(' '))
以便在视觉上将命令行整合在一起(通常是一个变量)。
使用split()
而不是手动构建列表(再次,当命令已知)时,是否存在任何内在错误。或者这些答案是否明确表明需要列表?
我试图找到一些缺点(多个空格,转义空格......)但我不知道这种方法可能出错的地方?
注意:这个问题具体涉及分裂空间的稳健性,而不是安全问题或其他(非常重要的)因素。
答案 0 :(得分:2)
观察这是有效的:
>>> import subprocess
>>> subprocess.call(['ls', '-l', "my file"])
-rw-rw---- 1 john john 0 May 5 10:46 my file
0
但这不是:
>>> subprocess.call('ls -l "my file"'.split(' '))
ls: cannot access "my: No such file or directory
ls: cannot access file": No such file or directory
2
这确实有效:
>>> import shlex
>>> shlex.split('ls -l "my file"')
['ls', '-l', 'my file']
>>> subprocess.call(shlex.split('ls -l "my file"'))
-rw-rw---- 1 john john 0 May 5 10:46 my file
0
在python philosphy中,explicit is better than implicit。因此,在这三种形式中,使用这一种形式:
subprocess.call(['ls', '-l', 'my file'])
这样可以避免所有预处理,并清楚明确地显示显式将执行的内容及其参数。
答案 1 :(得分:0)
如果您确定未转义字符(包括文件名中的空格)没有问题,那么我没有看到任何问题。
但您可能会发现使用os.system("ls -l")
更容易。请注意,如果要使用结果代码,则应将其右移8位:
exit_code = os.system("ls -l") >> 8
或者(更强大,但也需要更多工作...):
subprocess.call('ls -l', shell=True)
然后你让shell处理分裂。
编辑:还提到子流程。