我正在编写一个脚本来自动化一些GIT任务。我了解GITPython,但我不喜欢使用它。即使艰难,也可能会更容易。

我得到以下代码:

def executeCommand(cmd):
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
    out, error = p.communicate()
    if not error:
        return out.strip()
    else:
        print repr(out)
        print repr(error)
        print "Stopping execution!\r"
        exit(0)


给出命令['git', 'checkout', 'master']的这段代码确实确实检出了主服务器。但是它将停止执行,显然是因为错误变量不为空。我尝试将输出打印为以下错误:

"Your branch is up-to-date with 'origin/master'.\n"
"Switched to branch 'master'\n"
Stopping execution!


如您所见,它成功检出了master分支(也已通过git status验证)。但是,为什么第二行填充了error变量?如何处理呢?还是没有办法正确处理呢?还是我不应该进行任何错误检查?最好的解决方案/解释是什么?

谢谢!

最佳答案

这不是错误!其输出在stderr :)

如果您使用的是Linux终端,则可以通过运行以下命令进行测试

git checkout master 2>/dev/null

# You shouldn't see any output.
# This is because git is writing those messages to stderr.


根据subprocess docs


  communication()返回一个元组(stdoutdata,stderrdata)


即stdout和stderr的输出。

如果要检查错误,则应使用returncode属性。

在你的情况下

stdout, stderr = p.communicate()
if p.returncode == 0:
    return stdout.strip()

else:
    # handle error
    print repr(stdout)
    print repr(stderr)
    print "stopping execution!\r"
    exit(0)

07-27 17:39