使用pexpect的Git命令:终端功能不全

时间:2016-11-24 16:16:42

标签: git python-2.7 pexpect

我目前正在开发一个程序,它应该通过pexpect控制一个git存储库。

git status这样的简单命令正在运行,但像git diff --name-status ...这样的命令却没有。我收到以下错误消息:WARNING: terminal is not fully functional

我发现的所有解决方案都是为了解决Windows或Mac上的问题。

来自我的程序的代码片段:

my_bash = pexpect.spawn('/bin/bash', cwd="/home/xxx/clone_repo/local.repo/")
my_bash.logfile = sys.stdout
my_bash.sendline(git diff --name-status branch1 branch2)

有人知道这个问题的解决方案吗?我可以用更实用的终端运行pexpect吗?

问候约翰尼

1 个答案:

答案 0 :(得分:2)

  

我收到以下错误消息:警告:终端功能不全。

这是一个警告,而不是错误。

  

我可以使用功能更强大的终端来运行pexpect吗?

你可以(参见,例如,https://github.com/docker/docker/issues/8631;请注意,提及操作系统和环境等细节至关重要;我只是在这里猜测) - 但除非您编写的测试必须像人类交互一样在终端上,你不应该打扰。要从程序中驱动Git,请使用设计为程序驱动的Git部分。例如,运行git diff而不是git diff-tree,而不是my_bash = pexpect.spawn('/bin/bash', cwd="/home/xxx/clone_repo/local.repo/") my_bash.logfile = sys.stdout my_bash.sendline('git diff --name-status branch1 branch2')

proc = subprocess.Popen(['git', 'diff-tree', '-r',
                         '--name-status', 'branch1', 'branch2'],
                         shell=False, cwd='/home/xxx/clone_repo/local.repo')

out, err = proc.communicate()
status = proc.wait()

你可以这样做:

git diff-tree

然后使用此结果。您可以更直接地控制程序,并使用shell=False这是一个“管道命令”,您可以获得设计为机器可读的输出。见Which are the plumbing and porcelain commands?

(通过使用fromEvent,您还可以防范常见的安全问题。)