我目前正在开发一个程序,它应该通过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吗?
问候约翰尼
答案 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
,您还可以防范常见的安全问题。)