python3.9-amd4(win10) subprocess运行git命令的一个奇怪的问题

举报
Amrf 发表于 2022/08/15 16:48:05 2022/08/15
【摘要】 在尝试在windows环境直接使用gerrit时,遇到一个问题,命名git已经添加到环境变量,repo 里面依旧提示找不到git,直接在同一个代码里添加print(subprocess.run([“git”, “–version”], check=True, stdout=subprocess.PIPE).stdout)发现是可以调用的,定位了具体的问题点在repo文件的def run_co...

在尝试在windows环境直接使用gerrit时,遇到一个问题,命名git已经添加到环境变量,repo 里面依旧提示找不到git,
直接在同一个代码里添加print(subprocess.run([“git”, “–version”], check=True, stdout=subprocess.PIPE).stdout)发现是可以调用的,
定位了具体的问题点在repo文件的def run_command(cmd, **kwargs):方法中, 默认的选项为

kwargs.setdefault('stdout', subprocess.STDOUT)
kwargs.setdefault('stderr', subprocess.STDOUT)

验证发现无论用subprocess.run 还是subprocess.Popen只要stdout=subprocess.STDOUT就会异常,stdout=subprocess.PIPE是正常的
添加调试代码

  try:
    p = subprocess.Popen(["git", "--version"], stdout=subprocess.STDOUT)
    while True:
      line = p.stdout.readline()
      print(line)
  except Exception as err:
    print(traceback.format_exc())

可以找到错误的堆栈位于C:\Users\xxxx\AppData\Local\Programs\Python\Python39\Lib\subprocess.py

            elif isinstance(stdout, int):
                print(stdout,sys.stdout.fileno())
                c2pwrite = msvcrt.get_osfhandle(stdout)
            else:

subprocess.STDOUT的值是-2
会在msvcrt.get_osfhandle调用时抛异常Bad file descriptor
看了下msvc的说明入参应该是文件句柄fd,没看到标准句柄的处理

处理办法可以修改repo的run_command的默认stdout值

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。