Python子进程产生的结果与shell不同?

时间:2014-11-25 16:32:49

标签: python git shell

我试图从python脚本运行git log命令,以查找一个分支与另一个分支有多少分离(即多少提交)。我正在使用的git命令是:

git log HEAD ^master --no-merges --oneline | wc -l

据我所知,我应该可以使用子进程在python中运行它,如下所示:

import subprocess;
print subprocess.check_output('git log HEAD ^master --no-merges --oneline | wc -l',  shell=True)

但是,我始终从这两段代码中得到不同的结果。

为了测试这个,我从master创建了一个新分支,修改了一个文件并提交了它。然后我运行了两个命令:

$ git log HEAD ^master --no-merges --oneline | wc -l
    1

$ python -c "import subprocess; print subprocess.check_output('git log HEAD ^master --no-merges --oneline | wc -l', shell=True)"
    1334

知道为什么会这样吗?我只是疯了吗?

更新

我已经能够通过使用子流程文档中提到的策略来解决这个问题:

command = ['git', 'log', 'HEAD', '^master', '--no-merges', '--oneline']
p1 = subprocess.Popen(command, stdout=subprocess.PIPE)
p2 = subprocess.Popen(['wc', '-l'], stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()
commit_count = int(p2.communicate()[0])

我仍然很好奇,为什么shell = True策略会产生如此不同的结果......

1 个答案:

答案 0 :(得分:1)

两个调用可以有不同的环境吗?就像,目前不同的目标?

在没有| wc -l和/或使用诊断标志的情况下尝试此操作,以便更好地了解要完成的操作。