用split('')分割命令行有什么问题吗?

时间:2016-05-05 17:40:58

标签: python unix split

在大多数answers(我发现)问题“如何运行外部命令”中我看到了一些内容

  

如果您想运行ls -l,则需要使用subprocess.call(["ls", "-l"])

当我知道将要运行的是我通常会做的是调用subprocess.call('ls -l'.split(' '))以便在视觉上将命令行整合在一起(通常是一个变量)。

使用split()而不是手动构建列表(再次,当命令已知)时,是否存在任何内在错误。或者这些答案是否明确表明需要列表?

我试图找到一些缺点(多个空格,转义空格......)但我不知道这种方法可能出错的地方?

注意:这个问题具体涉及分裂空间的稳健性,而不是安全问题或其他(非常重要的)因素。

2 个答案:

答案 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处理分裂。

编辑:还提到子流程。