【发布时间】:2019-03-11 10:56:03
【问题描述】:
我有一个作为启动脚本写入屏幕的 python 脚本。我想监控服务器的进度,所以我进入一个循环检查状态。我不想写下画面。因此我使用 sys.stdout.write。问题是我正在使用的程序(wlst Weblogic)打印了所有我不想显示的日志记录。我通过使用 grep 来解决这个问题,并且只打印以空格开头的行。
我有这个功能
def printRoll():
print ' Is my Print working'
myTest = ' Hello'
myTest1 = 'test 123'
sys.stdout.write("\r %s " % myTest)
sys.stdout.flush()
systime.sleep(10)
sys.stdout.write("\r %s " % myTest1)
sys.stdout.flush()
systime.sleep(10)
我要显示的是:
Is my Print working
Hello
然后在 10 秒后 Hello 被覆盖
test 123
如果我运行 grep 命令
python 'printRoll()' | grep '^[[:space:]]\{1\}[A-Za-z0-9]' --line-buffered
它只打印第一行
Is my Print working
它不会打印任何 sys.stdout.write 行。我认为这是缓冲的问题,但我找不到我的问题的示例。
python 脚本按预期工作,但它还包含许多我不想打印到屏幕上的其他信息。
任何帮助表示赞赏。
我相信它是 Python 的旧版本,即 2.7
干杯 詹姆斯
【问题讨论】:
-
使用
\r,您正在打印回车符,这在 UNIX 上不是换行符。您应该使用\n打印换行符。但是,如果您想进行日志记录,特别是将一些消息记录到标准输出而将其他消息记录到文件,则应该考虑使用 Python 中的标准 logging 模块。 -
我不想换行我想换行。我认为这意味着 grep 将不起作用,任何想法如何获得此功能?我刚刚尝试了这段代码作为测试,标准输出仍然没有打印 def printRoll(): print ' Is my Print working' myTest = ' Hello' myTest1 = 'test 123' sys.stdout.write("\n %s " % myTest) #sys.stdout.flush() systime.sleep(10) sys.stdout.write("\n %s " % myTest1)
-
像 grep 这样的命令是面向行的。事实上,
--line-buffered特别意味着它在看到换行符之前不会输出任何内容。如果您想清除和重写消息,但只想显示某些消息,我建议您使用一个选项来设置详细级别。