首页 > 解决方案 > python的创意标准输入和错误处理

问题描述

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

想法?

标签: pythonstdoutstdin

解决方案


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

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

推荐阅读