未捕获Python子进程“git gc”stderr

未捕获Python子进程“git gc”stderr,第1张

概述这是我观察到的行为: >>> out = subprocess.check_output("git gc", shell=True)Counting objects: 4869, done.Delta compression using up to 8 threads.Compressing objects: 100% (1219/1219), done.Writing objects: 这是我观察到的行为:

>>> out = subprocess.check_output("git gc",shell=True)Counting objects: 4869,done.Delta compression using up to 8 threads.Compressing objects: 100% (1219/1219),done.Writing objects: 100% (4869/4869),done.Total 4869 (delta 3607),reused 4869 (delta 3607)

*** 作输出在STDERR中打印.我想在变量中捕获这个,所以我将stderr发送到STDOUT.但它没有抓住它.

>>> out = subprocess.check_output("git gc",shell=True,stderr=subprocess.STDOUT)>>> outb''>>> print(out)b''

有什么想法/建议吗?

似乎git gc是一种特殊情况,其中输出重定向是不可能的.在另一个问题中建议使用打字稿,但是有更多知识的人可以解释这种行为吗?脚本方法不起作用,因为它没有退出fork.

解决方法 git gc真的是一个特例,请看这里:
Trying to redirect ‘git gc’ output

尝试使用git status来查看差异.

更新

问题是一个很好的挑战.一位同事查看了GIT的源代码,发现如果进程没有在后台启动,git gc只会写入stdout.经过一番搜索,我遇到了pty library,并受到了https://stackoverflow.com/a/6953572/2776376的启发,找到了一个有效的解决方案.下面的代码捕获了git gc的stdout,尽管它必须写入文件.

#!/usr/bin/env pythonimport osimport ptyimport syslog_name = 'git_log.txt'def git_logger():    (child_pID,fd) = pty.fork()    if child_pID == 0:        #parent process        sys.stdout.flush()        os.execlp("git","git","gc")    else:        #child process        output = os.read(fd,100)        while True:            try:                output += os.read(fd,1024)            except:                break        with open(log_name,'w') as log_file:            log_file.write(output)if __name__ == "__main__":    git_logger()    with open(log_name,'r') as log_file:        print(log_file.read())
总结

以上是内存溢出为你收集整理的未捕获Python子进程“git gc”stderr全部内容,希望文章能够帮你解决未捕获Python子进程“git gc”stderr所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1197600.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存