>>> 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
,我看到脚本抛出了类似的错误。
我在变量中获取参数并且可能有空格,它必须按原样传递给脚本,我该怎么做?
答案 0 :(得分:1)
假设run
是subprocess.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命令。)