命令行程序的消息传递

时间:2018-03-11 08:08:10

标签: python

我倾向于编写很多命令行实用程序,并且想知道是否 有一种在Python中用户发送消息的标准方法。具体来说,我想以符合Unix约定的方式打印错误和警告消息,以及其他更多的会话输出。我可以使用内置的print函数自己生成这些,但是消息具有统一的结构,所以看起来有一个包来处理这个对我很有用。

例如,对于您可能直接在命令行中运行的命令 得到这样的消息:

This is normal output.
error: no files given.
error: parse.c: no such file or directory.
error: parse.c:7:16: syntax error.
warning: /usr/lib64/python2.7/site-packages/simplejson:
    not found, skipping.

如果命令可能在脚本或管道中运行,则应包含其名称:

grep: /usr/dict/words: no such file or directory.

如果可以处理冗长程度,那就太好了。

这些事情在概念上都相对简单,但可能导致很多 每个印刷声明的附加条件和复杂性。

我已经查看了Python中的日志工具,但它似乎过于复杂,并且比命令行实用程序更适合守护进程。

2 个答案:

答案 0 :(得分:1)

我可以推荐Inform。这是我见过的唯一可以满足这种需求的方案。它提供各种打印功能,可在不同情况下打印或使用不同的标题打印。例如:

log()       -- prints to log file, no header
comment()   -- prints if verbose, no header
display()   -- prints if not quiet, no header
output()    -- always prints, no header
warning()   -- always prints with warning header
error()     -- always prints with error header
fatal()     -- always prints with error header, terminates program.

通知将这些功能称为“线人”。 Informants与Python print函数非常相似,因为它们接受任意数量的参数并通过将它们连接在一起来构建消息。它还允许您指定罪魁祸首,它被添加到消息的前面。

例如,这是一个使用Inform编写的简单搜索和替换程序。

#!/usr/bin/env python3
"""
Replace a string in one or more files.

Usage:
    replace [options] <target> <replacement> <file>...

Options:
    -v, --verbose            indicate whether file is changed
"""

from docopt import docopt
from inform import Inform, comment, error, os_error
from pathlib import Path

# read command line
cmdline = docopt(__doc__)
target = cmdline['<target>']
replacement = cmdline['<replacement>']
filenames = cmdline['<file>']
Inform(verbose=cmdline['--verbose'], prog_name=True)

for filename in filenames:
    try:
        filepath = Path(filename)
        orig = filepath.read_text()
        new = orig.replace(target, replacement)
        comment('updated' if orig != new else 'unchanged', culprit=filename)
        filepath.write_text(new)
    except OSError as e:
        error(os_error(e))

Inform()用于指定您的偏好; comment()和error()是 举报人,他们实际上打印信息;和os_error()是一个有用的实用程序,它将OSError异常转换为可用作错误消息的字符串。

如果你要运行它,可能会得到以下输出:

> replace -v tiger toe eeny meeny miny moe
eeny: updated
meeny: unchanged
replace error: miny: no such file or directory.
replace error: moe: no such file or directory.

希望这可以让您了解Inform的功能。那里有更多的力量。例如,它提供了一组在打印消息时很有用的实用程序。一个例子是os_error(),但还有其他一些。您还可以定义自己的线人,这是一种处理多个级别的详细程度。

答案 1 :(得分:0)

import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s') 
上面指定的

level控制输出的详细程度。

您可以将处理程序(这是复杂性超过我的优势)附加到日志以将输出发送到不同的地方(https://docs.python.org/2/howto/logging-cookbook.html#multiple-handlers-and-formatters),但我还不需要比命令行输出更多日期。

要生成输出,您必须在记录时指定它的详细程度

logging.debug("This debug message will rarely appeal to end users")

我没看过你最后一行,答案似乎很明显,我不会想到单basicConfig行可以被描述为&#34;过于复杂&#34 ;。当打印不够时,我只使用了60%的时间。