有没有一种标准的UNIX方法可以将<filename>和<lineno>毫不含糊地写入stderr?

2024-06-10 17:14:31 发布

您现在位置:Python中文网/ 问答频道 /正文

问题陈述

我有一个应用程序(python,如果有关系的话)可以解析文件,并且在解析过程中可能会产生错误。当发生这种情况时,我将错误发生的位置记录到stderr中,然后优雅地退出。你知道吗

在向stderr写入位置时,必须在日志记录的绝对路径和相对路径之间进行选择。你知道吗

当stderr是控制台时,我需要在短且可读的相对路径和将stderr重定向到日志文件并稍后检查的绝对路径之间进行权衡。你知道吗

我现在拥有的

我现在所做的就是这样

def clean_path(path):
    rpath = os.path.relpath(path, '.')
    if len(rpath) < len(path):
        path = rpath
    return os.path.normpath(path)

然后将结果格式化为

<filename>, lineno <lineno>: <message>

并将其写入stderr或program config中指定的日志文件。通常是标准的。你知道吗

缺乏明显的共识

我看过GNU标准,http://www.gnu.org/prep/standards/standards.html#Errors ,它们没有指定。 它们也偏离了上述格式,我在其他地方也看到过这种格式——尽管我现在记不起在哪里。你知道吗

GCC总是使用传递给GCC的文件名,但是出于实现的原因,我操作的大多数文件都是绝对路径。你知道吗

Bash解释器错误甚至没有指定文件。你知道吗

我找不到任何pep指定这种python日志记录的标准,但是在一个快速测试中,pep8和flake8似乎遵循GNU标准。你知道吗


似乎GNU标准是事实上的标准,但并不是每个人都遵循它(出乎意料!)。 真的是这样吗?你知道吗

考虑到我使用的大多数路径在错误日志代码与它们交互之前都将被规范化为绝对路径,那么专门处理这些路径会被认为是糟糕的做法吗?你知道吗


Tags: 文件pathgnu路径标准lenos格式
1条回答
网友
1楼 · 发布于 2024-06-10 17:14:31

GNU“标准”实际上只是一套指导方针。然而,正如你所注意到的,并不是每个人都遵循它。事实上,我敢说,在GNU项目之外,很少有人愿意遵循它。你知道吗

也就是说,你好像是自己做研究的。由于在这个问题上没有共识,我想说的是简单地让你的应用程序易于使用。您似乎已经做出的决定是:

<filename>, lineno <lineno>: <message>

似乎很合理。我还要在那一行添加应用程序的名称、错误类型和代码,有点像这样:

<appname>: Parsing Error: <message>
    In <filename>, line <lineno>: <code>

最后,不要将错误写入日志文件(除非用户以某种方式指定他们想要这样做;即:命令行选项)。相反,将所有错误写入stderr。如果用户愿意,可以手动将stderr管道传输到如下文件:

$ python <appname>.py 2><appname>.log

比如说,你的应用程序名为parser,看起来像:

$ python parser.py 2>parser.log

相关问题 更多 >