gpt4 book ai didi

python-3.x - 如何使用子进程管道进行错误处理

转载 作者:行者123 更新时间:2023-12-03 08:21:59 24 4
gpt4 key购买 nike

看来我无法访问 process.stdout 两次。但我不知道如何解决它。我正在 try catch 由我的命令导致的任何 git 错误,并捕获任何有用的输出。

如果输出错误或不存在,我想知道它,所以我最终不会尝试修改不存在或无意义的变量。

但是,似乎通过探测输出是否有错误,我失去了捕获有意义输出的能力。

有没有更好的方法可以满足这两种情况?

到目前为止,我刚刚尝试了这两种排列方式。但是当我首先检查有效性时,我似乎无法访问输出以对其进行任何操作。但是,如果我尝试在没有验证的情况下使用它,我就会失去我的错误处理。

def gitinfo(sha1, placeholder, repoDir = '/mnt/d/stash.projects/rea'):
placeholders = {'hash':'%H', 'comment':'%s', 'time':'%cd', 'newline':'%n'}

if placeholder not in placeholders:
print('Error: function gitinfo is not programmed for paceholder: ' + placeholder)
print('Please see source, or try \'hash\', \'comment\', \'time\', or \'newline\'.')
return 'Good day.'

format_option = '--format="' + str(placeholders[placeholder.lower()]) + '"'
date_format = '%Y-%m-%d %H:%M:%S'
date_option = '--date=format:\'' + date_format + '\''
cmd = ['git', 'show', format_option, date_option, '-s', sha1]

with subprocess.Popen(cmd, cwd=repoDir, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) as proc:

if not proc.stdout.read():
warn(proc.stderr.read())
return 'Error retrieving ' + placeholder + ' in function gitinfo.'


for line in proc.stdout:
result = line.rstrip('\n')


if placeholder.lower() == 'time':
result = result.replace("'", "")

return result

最佳答案

stdoutstderr不是字符串,它们是流。将它们想象成水箱的一种方式是:该过程是将水倒入顶部,底部有一个水龙头可以使用。 stdout.read()说“打开水龙头,让它运行,直到水箱里没有水”——如果你没有在水龙头下放一个桶(在这个类比中分配给一个变量),水就没有了,然后打开水龙头再次从空 jar 中取出它不会把它带回来。

如果您需要多次访问流中的相同输出,则必须将其存储在一个变量中,然后每次都引用该变量。在您的情况下,您可以执行以下操作:

output = proc.stdout.read()
if not output:
# your error handling here
for line in output.split("\n"):
# do stuff with line here

关于python-3.x - 如何使用子进程管道进行错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54223108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com