4

假设我想运行类似ls a*使用的东西plumbum

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

我知道铅会自动逃避争论,这通常是一件好事。但是有没有办法让它理解 glob 表达式应该按原样传递给 shell?

4

3 回答 3

6

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

plumbum按原样传递a*ls命令。lscommand 不运行任何 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()函数可能会产生与 shell 不同的 glob 扩展。

于 2013-03-31T17:23:06.193 回答
2

glob您可以使用 Python 的内置模块进行自己的全局扩展。对于您的示例:

from plumbum.cmd import ls
from glob import glob

ls[glob('a*')]
于 2013-03-31T14:59:44.190 回答
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*')
于 2015-10-23T20:28:27.130 回答