2014-12-05 52 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