【问题标题】:sys.stdout.write does not grepsys.stdout.write 没有 grep
【发布时间】: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 特别意味着它在看到换行符之前不会输出任何内容。如果您想清除和重写消息,但只想显示某些消息,我建议您使用一个选项来设置详细级别。

标签: python grep


【解决方案1】:

问题是,就grep 而言,其他行不是新行,因为您没有输出\n 换行符。

grep 看到的是 - 此输出是通过 xxd 进行的十六进制转储,因此我们可以看到所有字符 - 以下。 0a(在转储的第二行)是换行符。您可以看到之后不再有换行符 (0as),因此 grep 无需再将输入分割成行。

00000000: 2049 7320 6d79 2050 7269 6e74 2077 6f72   Is my Print wor
00000010: 6b69 6e67 0a0d 2020 4865 6c6c 6f20 0d20  king..  Hello . 
00000020: 2074 6573 7420 3132 3320                  test 123 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多