2013-10-10 41 views
0

我将Git支持添加到用Python编写的现有应用程序(使用PyQt)。我决定通过subprocess.Popen直接与Git命令交互,并解析不同命令的结果(因为我们想要实现的几件事情导入完整的第三方库似乎不太合适)。使用Python的git-fetch进行通信

到目前为止,我已成功合并git branchgit remote,这或多或少有效,因为我仍在本地回购库中。
现在我正在处理git fetch并遇到困难。

首先,我从stderr上的gnome-keyring得到了一个“警告”。这是由于我的安装有问题,但我们当然不应该因为这种事情而挂断。所以我简单地忽略这个警告。可能这很不明智,但现在我认为如果应该报告问题,我们可以接受这种解决方法。

但后来我遇到了问题,shell问我(再次在stderr上)输入我的SSH密码。这也是我在特定计算机上安装的问题,但如果用户更喜欢个人密码,我们应该真的接受。所以我必须处理这种情况。


因此冗长的介绍后,这个问题是相当简洁:

如果我通过subprocess.Popen运行像git fetch从Python中的shell命令,这外壳程序要求的用户反馈,我怎么能与它进行交互,从蟒蛇?
基本上我想显示stderr输出给用户并允许他输入他的密码。 (然后当然实现一个选项来存储这个密码在应用程序中。)

回答

0

如果我记得没错,ssh非常关注它如何与用户交互,甚至直接打开/dev/tty(不只是尝试工作其STDERR_FILENO)。但是,您可以设置SSH_ASKPASSDISPLAY以使其在X11显示屏上使用特定程序。手册页指出,您可能必须将其stdin连接到/dev/null才能完成此项工作。

因此,这两种方法看起来都是用它来工作,或者从Python内部分配一个伪tty,然后运行需要ssh和那个pty作为其控制终端的git命令。内置的(但只有Unix/Linux)os.openpty会让你在那里,但还有更多事情要做。

pexpect module拥有你需要的一切,虽然我从来没有用过它。