【问题标题】:Creative stdin and error handling for pythonpython的创意标准输入和错误处理
【发布时间】:2018-10-13 02:49:36
【问题描述】:

我在 Windows10 上使用第三方程序——称之为 SuckySoftware.exe。

这个程序可以启动一个 python 脚本并做其他事情。

当它启动 python 脚本时,不幸的是我没有启动命令窗口。这会产生三个问题:

1) 我不能给它输入。例如,使用 python3 并将“input()”作为命令之一会导致 SuckySoftware.exe 挂起,因为它正在等待输入到某些不存在的命令窗口。

2) 我无法获得输出。所以“print('hello')”不会出现在任何地方

3) 没有错误处理。因此,如果我的 python 代码中有 ValueError,它会在该行静默失败,并且不会执行 python 的其余部分。

我已经解决了#2:

sys.stdout = open(logfile, 'wb', 0)
sys.stdout.write('hello'.encode('utf-8'))

然后使用mTail实时监控日志文件。

我不知道如何解决 1 或 3。

对于 1,我想知道是否有一种简单的方法可以用一个文本框启动一个简单的 GUI。每当我的日志文件显示“请输入一个值”时,我就可以将其输入到该文本框中并按 Enter,它会将其输入标准输入。然而,这似乎过于复杂。

对于 3,我想知道我是否可以捕获所有错误消息(包括失败的行号)并在脚本退出之前将它们打印到标准输出。

想法?

【问题讨论】:

  • 是否以sys.stderr 而非地址#3 打开文件?
  • 不!除非我做错了。我这样做:sys.stderr = open(logfile,'wb',0);raise ValueError('blah')。日志文件中没有任何内容。如果我故意犯了类似 print(,,,,) 的语法错误,也是一样。我知道写入日志文件是有效的,因为我可以执行 sys.stderr.write('blah'.encode('utf-8')) 并且有效。
  • 它确实停止了脚本:raise ValueError('blah')。换句话说,如果我在此之前和之后放置一个 .write 语句,那么之前的语句会执行,但之后的语句不会。因此引发错误并停止执行,但实际错误不会写入日志文件。

标签: python stdout stdin


【解决方案1】:

首先,以sys.stderr 的身份打开一个文件,因为那里的输出在任何情况下都可能有用。

  1. 最简单、最便携的技术是将sys.stdin 设置为与另一个进程的(TCP,又名SOCK_STREAM)套接字连接。
  2. 您也可以使用sys.stdout 和/或sys.stderr 这样的套接字,尽管辅助进程必须使用select 来处理多个流而不会出现死锁。 (您可能希望使用 wrapper 作为 sys.stderr 来保持其未缓冲状态。)
  3. sys.excepthook 分配一个函数,该函数通过(您的)stderr 报告异常。 (可能已经分配了这样的功能,因为 sys.stderr 上没有显示任何内容。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 2014-07-22
    相关资源
    最近更新 更多