【问题标题】:Respond to git command line prompt from Python program从 Python 程序响应 git 命令行提示
【发布时间】:2016-02-23 22:06:28
【问题描述】:

我目前正在使用 Python 程序在对文件进行一些编辑后自动提交到存储库。我正在使用subprocess.Popen 创建一个调用 git 二进制文件的子进程。我虽然可以在创建子进程时使用stdin=PIPE,并且能够在命令行提示时写入我的用户凭据,但由于某种原因,这没有发生。代码如下所示:

proc = Popen(["git","push","origin","master"], stdin=PIPE)
proc.communicate("username")
proc.communicate("password")

现在发生的事情是它正在调用二进制文件,但仍向我显示命令行提示符。我在这里查看了其他一些问题,但它们都使用与我基本相同的代码,所以我对这个问题有点困惑。我知道还有很多其他方法可以实现此结果,例如缓存我的凭据,但我很想知道这种方法是否可行,原因有很多。

【问题讨论】:

  • 就像我说的,我知道还有其他方法可以做到这一点。我只是想知道这种方式是否适用于一些项目特定的原因。
  • 不能使用通信两次,写入标准输入
  • 由于某种原因使用 write 给我一个 I/O 错误。
  • 虽然这不能回答您的问题,但我可以提一下处理 Python 中 GIT 的模块已经编写好了 here 您可能想改用它。
  • 您需要用户名和密码还是只需要密码?当我推或拉时,我只需要输入我的密码。

标签: python git pipe subprocess popen


【解决方案1】:
proc = Popen(["git","push","origin","master"], stdin=PIPE,stdout=PIPE,stderr=PIPE)
time.sleep(1)
proc.stdin.write("username")
time.sleep(1)
proc.stdin.write("password")
#or maybe
for letter in "password":
    proc.stdin.write(letter)
    time.sleep(0.1)
print proc.communicate()

我猜是这样的......

【讨论】:

  • 似乎无法正常工作。它将用户名写到屏幕上,但之后 git 不再提示输入密码,程序就退出了。
  • hmmm 好吧,我还是建议切换到 keyauthentication... 猜测它被编程到 git 中一次想要一个字符或某事并立即发送整个密码会破坏它...如果它太难了,您可能只想使用pygit2.org/remotes.html#credentials
  • 是的,我认为你是对的。或者你知道是否可以在“git push origin master”的同一行中指定用户名和密码。我知道 git cred store 将凭据维护为“用户名:密码@repo.com”。
  • 取决于我认为哪个 git 客户端...... afaik tortoise git 让你以某种方式做到这一点......你可能只想使用 pygit pygit2.org/remotes.html#credentials
猜你喜欢
  • 2013-03-23
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多