2013-03-31 30 views
3

假设我想使用plumbum运行类似ls a*的东西。避免在铅中转义glob表达

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?

回答

5

但是,有没有办法让它明白水珠表达式应该传递到外壳原样?

plumbum通过原样a*ls命令。 ls命令不运行任何shell,因此没有glob扩展(它由* 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列表明确转换为元组)。

如果你想;你可以致电贝:

from plumbum.cmd import sh 

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

注:Python的glob.glob()功能可能会产生水珠扩张从外壳的不同。

+0

感谢您的详细解答 – shx2

+0

对于远程命令执行,您会推荐什么? –

+0

@PeterGibson:这取决于。评论似乎与答案无关。也许,你想要问一个单独的堆栈溢出问题。 – jfs

2

你可以使用Python内置的​​做你自己的glob扩展。对于你的例子:

from plumbum.cmd import ls 
from glob import glob 

ls[glob('a*')] 
+0

有可能是在'铅1.1.0'因为'LS [水珠的错误('a *')]()'失败,但'ls [元组(glob('a *'))]()'工作。 – jfs

+1

+1。它固定在铅1.4.1上,即'ls [glob('a *')]()'起作用(注意:最后的圆括号在那里运行命令)。 – jfs

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*')