2013-03-31 60 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*')