避免在plumbum中转义glob表达式

时间:2013-03-31 13:56:29

标签: python shell plumbum

假设我想使用plumbum运行类似ls a*的内容。

from plumbum.cmd import ls
ls['a*']()
...
ProcessExecutionError: Command line: ['/bin/ls', 'a*']
Exit code: 1
Stderr:  | ls: a*: No such file or directory

我知道plumbum会自动转义参数,这通常是一件好事。但有没有办法让它理解glob表达式应该按原样传递给shell?

3 个答案:

答案 0 :(得分:6)

  

但有没有办法让它理解glob表达式应该按原样传递给shell?

plumbum按原样将a*传递给ls命令。 ls命令不运行任何shell,因此没有全局扩展(由* nix上的shell完成)。

您可以使用glob模块进行扩展:

from glob import glob

ls('-l', *glob('a*'))

另一种方法是使用Workdir对象:

from plumbum import local

ls('-l', *local.cwd // 'a*')

推迟通话;您可以使用ls['-l'][args]语法(注意:plumbum 1.1.0版本中可能存在需要将args列表明确转换为元组的错误。)

如果你想;你可以调用shell:

from plumbum.cmd import sh

sh('-c', 'ls -l a*')

注意:Python的glob.glob()函数可能会产生与shell不同的glob扩展。

答案 1 :(得分:2)

您可以使用Python的内置glob module进行自己的glob扩展。以你的例子:

from plumbum.cmd import ls
from glob import glob

ls[glob('a*')]

答案 2 :(得分:1)

对于ls的特殊情况,还有另一种方式:

from plumbum import local

p = local.path('path/to/dir')
local.cwd.glob(str(p) + 'a*')

- 或 -

from plumbum import local

p = local.path('path/to/dir')
local.cwd.chdir(p)
local.cwd.glob('a*')