抱歉,由于工作安全性的限制,我无法发布实际的代码,但我将尝试举一个人为的示例。
我正在使用python 3.6.1,并在Azure管道(ADS 2019)中运行模块。在模块中,我们使用具有以下结构的字典来完成输出
#dummy data, assume files could be in any order in any category
{
"compliant": ['file1.py', 'file2.py'], #list of files which pass
"non-compliant":['file3.py'], #list of files which fail
"incompatible":['file4.py'] #list of files which could not be tested due to exceptions
}
[发生故障时,我们的一位客户希望脚本输出命令以调用可以运行以更正不兼容文件的脚本。该程序的编写类似于以下内容
result = some_func() #returns the above dict
print('compliant:')
for file in result['compliant']:
print(file)
print('non-compliant:')
for file in result['non-compliant']:
print(file)
print('incompatible:')
for file in result['incompatible']:
print(file)
# prints a string to sys.stderr simillar to python -m script arg1 arg2 ...
# script that is output is based on the arguments used to call
print_command_to_fix(sys.argv)
正常运行时,我将得到正确的输出,如下所示:
#correct output: occurs on bash and cmd
compliant:
file1.py
file2.py
non-compliant:
file3.py
incompatible:
file4.py
python -m script arg1 arg2 arg_to_fix
但是,当我在Azure管道上运行时,输出像下面这样被交错
#incorrect output: occurs only on azure pipeline runs
compliant:
python -m script arg1 arg2 arg_to_fix
file1.py
file2.py
non-compliant:
file3.py
incompatible:
file4.py
无论我尝试使用print还是sys.stderr.write,它似乎都无法解决交错问题,并且我假设以某种方式异步调用了print_command_to_fix()。但是我的猜测可能并不准确,因为我已经很长时间没有使用ADS或python了。
TL; DR:仅在管道上获得上述交错的输出,我做错了什么?
编辑:阐明了某些要点和固定的错别字
[经过几个小时的故障排除和解决方案后发现答案。
ADS跟踪程序中的两个输出流,但异步进行。该错误是由于同时输出到stdout和stderr引起的。在这种情况下,将所有输出输出到一个流可以解决此问题。我采用的方法最终如下所示
result = some_func() #returns the above dict
output = []
output.append('compliant:')
output.extend(result['compliant'])
output.append(file)
output.extend(result['non-compliant'])
output.append('incompatible:')
output.extendresult['incompatible'])
# returns a string to simillar to python -m script arg1 arg2 ...
# script that is output is based on the arguments used to call
output.append(format_command_to_fix(sys.argv))
print('\n'.join(output))
或者,我认为其他用于输出异步信息的技术也应解决。