2014-11-25 8 views
0

저는 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]) 

을, 왜 쉘 = 진정한 전략은 그러한 다른 결과를 산출합니다 ...

+1

서브 프로세스가'|'를 이스케이프 처리 할 때 파이프를 별도로 지정해야한다고 생각합니다. – ch3ka

+0

@ ch3ka 아니요,'shell = True'로, 기본 쉘로 라인을 전달합니다. –

+0

'wc -l'없이 명령 출력을 덤프 할 수 있습니까? 커맨드를 실행하기 위해 호출 된 쉘이 사용하는 쉘과 다르므로 범인은'shell = True'라고 생각합니다. – vikramls

답변

1

두 개의 호출이 서로 다른 환경을 가질 수 있습니까? 다른 현재의 dirs처럼?

| wc -l 및/또는 진단 플래그를 사용하지 않고 정확히 시도한 내용을 더 잘 이해할 수 있습니다.

+0

네, 저 역시 저에게 일어났습니다. 'cwd' 매개 변수를 설정하는 것이 도움이되지 않는 것 같습니다 :/ – ethanbustad

+0

단지 많은 라인이 있기 때문에 정확하게 무엇을 하는지를 말하기 어렵습니다 ... 적어도 repo에서 모든 커밋을 출력하지 않는다고 말할 수 있습니다 ('git rev-list HEAD --count'는 파이썬 함수와 다른 값을 반환합니다). – ethanbustad

+0

어 ... 파이프를 파일로 만들고 'less' /'head'로 보시겠습니까? 다른 명령이 실행중인 것처럼 보입니다. –

관련 문제