저는 python 스크립트에서 git log 명령을 실행하여 하나의 브랜치가 다른 브랜치와 얼마나 다른지 (즉, 얼마나 많은 커밋이 발생했는지) 찾습니다. 내가 사용 망할 놈의 명령은 이것이다 : 내가 이해, 내가 지금처럼, 서브 프로세스를 사용하여 파이썬에서 이것을 실행할 수 있어야에서쉘과 다른 결과를 생성하는 파이썬 하위 프로세스?
git log HEAD ^master --no-merges --oneline | wc -l
:
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])
을, 왜 쉘 = 진정한 전략은 그러한 다른 결과를 산출합니다 ...
서브 프로세스가'|'를 이스케이프 처리 할 때 파이프를 별도로 지정해야한다고 생각합니다. – ch3ka
@ ch3ka 아니요,'shell = True'로, 기본 쉘로 라인을 전달합니다. –
'wc -l'없이 명령 출력을 덤프 할 수 있습니까? 커맨드를 실행하기 위해 호출 된 쉘이 사용하는 쉘과 다르므로 범인은'shell = True'라고 생각합니다. – vikramls