如何在Python中将空格分隔的参数传递给run()

时间:2018-06-18 20:58:23

标签: python python-3.x

>>> from subprocess import PIPE,run
>>> cmd="ls"
>>> args="-l -r -t"
>>> run([cmd,args])
ls: invalid option -- ' '
Try 'ls --help' for more information.
CompletedProcess(args=['ls', '-l -r -t'], returncode=2)

>>> args='-l'
>>> run([cmd,args]) #Now works

>>> args='-l'
>>> args2='-r'
>>> run([cmd,args,args2]) #Works too.

我使用脚本代替ls和一些参数代替-l -r -t,我看到脚本抛出了类似的错误。

我在变量中获取参数并且可能有空格,它必须按原样传递给脚本,我该怎么做?

1 个答案:

答案 0 :(得分:1)

假设runsubprocess.run,则不能将可执行文件和参数字符串传递给它;你只能传递一个参数列表,或者,如果你使用shell=True一个命令行字符串 - 无论哪种方式,列表或字符串都必须包含可执行文件。

通常,正确的方法是首先使用列表:

cmd = 'ls'
args = [cmd, '-l', '-r', '-t']
run(args)

如果您正在寻找一种方便的方式从交互式口译员那里做事,那么按照您的要求行事可能是合理的。

在这种情况下,您需要使用shlex来分割参数。

你会想要写一个能够为你处理事情的包装器。而不是from subprocess import run,而只是import subprocess,请执行以下操作:

def run(cmd, argstring, *args, **kwargs):
    cmdargs = [cmd] + shlex.split(argstring)
    return subprocess.run(cmdargs, *args, **kwargs)

但是,在这种情况下,您可能需要考虑使用更高级的Python交互式解释器,如IPython / Jupyter,或使用PyPI之一的花哨shell包装器库,或两者兼而有之。

例如,使用shell(我以前从未使用过,但在搜索中出现并且看起来很漂亮):

>>> from shell import shell
>>> cmd = shell('ls -l -r -t')
>>> print(cmd.output())
['total 11040',
 'drwxr-xr-x@   9 andrewbarnert  staff      288 Oct 26  2009 python-0.9.1',
# ...

或者更简单地说,来自IPython:

In  [1]: !ls -l -r -t
total 11040
drwxr-xr-x@   9 andrewbarnert  staff      288 Oct 26  2009 python-0.9.1
# ...

(如果你想捕获那个输出而不是看它,你可以阅读IPython%magic命令。)