我倾向于编写很多命令行实用程序,并且想知道是否 有一种在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中的日志工具,但它似乎过于复杂,并且比命令行实用程序更适合守护进程。
答案 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%的时间。