python3.9-amd4(win10) subprocess运行git命令的一个奇怪的问题
【摘要】 在尝试在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)