【发布时间】:2020-01-17 14:53:02
【问题描述】:
我正在尝试从 python 启动一个 3rd 方程序并向它发送消息,阅读答案。我不想在每条消息后重新启动 3rd 方程序。
所以我简化了这段代码:
process = subprocess.Popen([executable, "-b", paramValue],
stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, bufsize=1)
# clear some startup message, which for some reason is written into stderr
process.stderr.readline()
while 100k+ loops:
process.stdin.write(txtInputLine)
resultLine = process.stdout.readline().strip()
processData(txtInputLine, resultLine)
经过一段随机时间后,通常在循环开始后大约 30 分钟,程序挂起并停止工作。看来 readline() 只是手动并完全停止工作。
如何防止这种情况发生?如果它失败或类似的事情,我不必重新启动该过程(也许使用某种超时?)。
但我什至找不到 readline() 记录在哪里,似乎它只是在子流程文档中提到,没有关于该函数的完整文档,而且谷歌很难避免遇到缺少换行和问题的人的线程和其他阻止 readline 以更具确定性的方式工作的问题。
【问题讨论】:
-
你正在淹没你电脑的内存......哈哈。你应该创建一个工作示例。想想你的脚本是否应该有守护进程活动。当你从while循环中中断时会发生什么?只是一个
print('Done')或在工作示例中就足够了。对于工人.. 使用def A(): dosomething等。 -
.. 另外...您应该从 threading() 或多处理模块中对此进行编码。后者用于独立应用程序,线程在 python GIL 下完成。
-
我根本没有内存不足,也不需要线程,我所做的只是与一个命令行工具接口,该工具执行一些我需要的计算,特别是子进程是一个 c++ connect 4 求解器,我需要从中解决一些职位。
-
readline 的文档在这里:docs.python.org/3/library/io.html#io.IOBase.readline
-
你是否达到了某种缓冲限制?例如。你给了程序太多的输入,而没有从输出中读取足够的内容(反之亦然)。您是否检查过 STDERR 中没有装满等待清除的垃圾?如果不将 STDERR 发送到 PIPE,看看效果是否更好?
标签: python python-3.x subprocess python-3.7