2012-07-30 5 views
2

자식 페치를 할 때 출력을 얻으 려하지만 사용자 이름을 묻는 것이 멈추고 그걸 감지 할 수 없다.파이썬에서 msysgit에 사용자 이름을 물을 때 출력을 얻는다. (창문에)

cmd = 'git fetch origin master'.split() 
import subprocess 
p = subprocess.Popen(cmd, cwd='.',stderr=subprocess.PIPE) 
while p.poll() is None: 
    r = p.stderr.read(1) 
    print(r) 

을 그리고 그냥 아무것도 인쇄하지 않고 중단 : 파이썬 스크립트에서

즉이 : 내가하고 있어요. 만약 stderr를 파이핑하지 않고 실행했다면, 사용자 이름을 묻는 메시지가 나타납니다 (그래서, 쓰고 있지만 stderr.read는 아무것도 탐지하지 않습니다).

[16:41:45 X:\]python test.py 
Username for 'my.domain.com.br': 

내가의 process.stdin에 서면 아무 소용 표준 입력과 많은 다른 일을 닫는는 popen의 BUFSIZE을 변경,() 직접 stderr.fileno 처리 시도했습니다. 누구든지 그 일을 할 수있는 방법을 알고 있습니까? (내 생각에 msysgit은 플러시하거나 새로운 라인을 작성하지 않고 파이썬이 제대로 처리 할 수없는 사용자 이름을 묻는 것입니다. 어떤 경우에는 msysgit에서만 수정 될 수 있습니까? - 쉘에 나타나지만 이상한 일인가).

컨텍스트 : 한 번에 여러 저장소 (https://github.com/fabioz/mu-repo)를 처리 할 수 ​​있으므로 여러 저장소를 동시에 처리 할 수 ​​있으므로 프로그램을 사용하고 있습니다 너무 많은 것들이 왜곡 된 것처럼 보이기 때문에 실제로는 옵션이 아닙니다 (ssh 액세스가 지정되었거나 암호가 이미 다른 수단을 통해 설정되어 있다면 모든 것이 작동하지만 사용자에게 프로세스를 말하게하는 방법을 원합니다. 입력을 기다리는 대신 입력을 기다리는 것입니다. 패스워드를 묻는다면 자식을 실패하게 만드는 방법이 있습니다.

+1

어떤 특별한 이유 당신이 좋아 [Dulwich] (http://www.samba.org/~jelmer/dulwich/docs/index.html) 나 [pygit2] (https://github.com/libgit2/pygit2)와 같은 쉘 명령을 사용하십시오.)? – R0MANARMY

+0

하나는 단순성 (예 : 추가 컴파일 된 라이브러리 없음)이고 다른 하나는 디자인 상 msysgit (즉, 여러 프로세스를 처리하고 출력을 동기화하는 문제임)에 불과하므로 많은 것들이 필요하지 않기 때문입니다. 커맨드 라인을 재발 명하기 위해서, 한번에 여러 repos를 다루는 적절한 방법이있다. (사실 나는 서브 모듈이나 mr을별로 좋아하지 않는다.) –

+0

꽤 합리적으로 보이지만 더 많은 도움을 줄 수는 없지만 다른 도구를 배제하고 배제한다는 데 아무런 해가 없을 것이라고 생각합니다. – R0MANARMY

답변

0

사용자 이름과 이메일에 대한 전체 구성을 설정하십시오. 그러면 git은 이러한 메시지를 표시하지 않습니다.

git config --global user.name "Your Name" 
git config --global user.email "[email protected]" 
+0

이름을 묻는 메시지가 표시되지 않지만 암호를 요구하는 메시지가 표시됩니다.하지만 요점은 아닙니다. (내가 말한 것처럼 상황이 올바르게 구성되어 있으면 작동하지만 누군가 올바르게 사용하지 않으면 올바르게 사용합니다 구성, 나는 적절한 피드백을 줄 수 있기를 원합니다). –

0

하위 프로세스와 비슷한 문제가있었습니다. 내 환경 (Windows 7, 암호가 필요없는 자식)에 여러 번 코드를 실행하면 출력이 전부는 아니지만 일부가 표시되며 실행할 때마다 다른 양의 출력이 표시됩니다. 이 해결하기 위해, 나는 명령을 실행하고 임시 파일에 출력을 저장 한 다음 파일을 다시 읽고, 나는 모든 출력 할 때마다 얻을 - 뭔가를 같이 :

#!/bin/python 
import os 
import subprocess 

cmd = "git fetch origin master" 
filename = "temp.txt" 

if os.name == "posix": 
    p=subprocess.Popen(['sh', '-c', cmd+' >> '+filename]) 
elif os.name == "nt": 
    p=subprocess.Popen(['cmd.exe', '/c '+cmd+' >> '+filename]) 
while not os.path.isfile(filename): 
    pass 
fd = open(filename, 'r') 
return_value = None 
out = "" 
while return_value == None: 
    text = fd.readline() 
    if text: 
     out += text 
    return_value = p.poll() 
while text: 
    text = fd.readline() 
    if text: 
     out += text 
fd.close()