2014-12-05 71 views
1

The python sh docs say:蟒蛇SH庫,用連字符/破折號命令

對於有破折號在其名稱中的命令,例如在/ usr/bin中/谷歌鉻,代替破折號下劃線:

我試圖運行命令

git rev-parse --abbrev-ref HEAD 

當我嘗試運行命令,混帳返回我有錯誤的命令是錯誤的。任何方式來解決這個問題?

>>> from sh import git 
>>> git.rev_parse('--abbrev-ref', 'HEAD') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Python/2.7/site-packages/sh.py", line 769, in __call__ 
    return RunningCommand(cmd, call_args, stdin, stdout, stderr) 
    File "/Library/Python/2.7/site-packages/sh.py", line 330, in __init__ 
    self.wait() 
    File "/Library/Python/2.7/site-packages/sh.py", line 334, in wait 
    self._handle_exit_code(self.process.wait()) 
    File "/Library/Python/2.7/site-packages/sh.py", line 348, in _handle_exit_code 
    self.process.stderr 
sh.ErrorReturnCode_1: 

    RAN: '/usr/bin/git rev_parse --abbrev-ref HEAD' 

    STDOUT: 


    STDERR: 
git: 'rev_parse' is not a git command. See 'git --help'. 

Did you mean this? 
    rev-parse 

>>> 
+1

個人而言,我認爲這是'sh'模塊爲什麼是黑客集合的一個例子,與內置'subprocess'模塊的簡單行爲相比。是的,他們有時候很可愛,並且可以用於編碼 - 但如果人們關心正確性,行爲應該儘可能明確和清楚地指定。 – 2014-12-05 17:18:50

回答

1

的替換規則是隻在命令本身 - git - 不爭論,如'rev-parse' 。這樣做是因爲破折號在Python函數名稱中是不可能的,但在選項中是完全可能的。

@runDOSrun找到了一個解決方案:

git('rev-parse', '--abrev-ref', 'HEAD') 

這就是說,假設您的子命令語法傳遞rev-parse含蓄,像這樣:

git.rev_parse('--abrev-ref', 'HEAD') 

下劃線是在這種情況下適當的,因爲您將通過Python令牌預先添加子命令,但限制爲在該情況下可用的通常的一組字符(不包括破折號!)。

2

我不確定它爲什麼不工作。

然而,我發現,這可代替:

git('rev-parse', '--abrev-ref', 'HEAD') 

引出:

RAN: '/usr/bin/git rev-parse --abrev-ref HEAD' 
+0

你說得對。你的解釋比我的完整。 – runDOSrun 2014-12-05 17:07:58

+0

我很抱歉 - 我在這裏閱讀你的答案作爲自我回答,因此「你自己找到了一個答案」,而不是提供信用。這已得到糾正。 – 2014-12-05 17:15:33

+0

別擔心,沒問題:) – runDOSrun 2014-12-05 19:27:06