我正在尝试获取git fetch时的输出,但它正在停止询问用户名,我无法检测到。
I.e。:在我正在做的Python脚本中:
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':
我已经尝试直接处理stderr.fileno(),更改Popen bufsize,写入process.stdin,关闭stdin和许多不同的东西都无济于事。有谁知道如何让它工作? (我的感觉是msysgit只是在写一个没有刷新或写一个新行的用户名而且Python不能正确处理它,在这种情况下它可能只在msysgit上修复了? - 虽然它确实出现在shell中如果我不要管它,这很奇怪。
上下文:我正在做一个程序来帮助一次处理多个存储库(https://github.com/fabioz/mu-repo),因为它可以同时为许多存储库执行,没有管道它不是一个真正的选择,因为太多的东西显得乱码(如果指定ssh访问或密码已经通过其他方式设置,事情确实有效,但我想有办法告诉用户这个过程是等待输入而不是挂在那里 - 如果有办法执行它,确保git在发出密码时会失败,这也足够了。
答案 0 :(得分:0)
设置用户名和电子邮件的全局配置。然后git不会提示这些。
git config --global user.name "Your Name"
git config --global user.email "your@email.address"
答案 1 :(得分:0)
我遇到了与子进程类似的问题。当我在我的环境中多次运行你的代码时(Windows 7,git不需要密码),我得到一些但不是全部的输出,每次运行它时,我得到不同的输出量。为了解决这个问题,我运行命令并将输出保存到临时文件,然后读回文件,每次都得到所有输出 - 如下所示:
#!/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()