【问题标题】:Python Subprocess readline hangs() after reading all input读取所有输入后,Python Subprocess readline hangs()
【发布时间】:2016-12-04 21:33:00
【问题描述】:

我正在尝试从我在同一脚本中运行的 tcp 服务器读取行。我能够发送一个命令并读取它的输出,但最后(在读取所有输出之后)看起来该程序挂在 readline 中,我尝试了几乎所有的解决方案 herehere 但它仍然挂起。

这些解决方案中的大多数建议检查 readline 的输出是否为无,但在我的情况下,程序永远不会从上次读取中返回并且只是挂在那里。

tcp 服务器不在我的控制范围内,或者说我只需要测试服务器脚本,因此我无法修改它。另外,是否可以在不使用子进程的情况下使用 python 向正在运行的服务器发送命令?有更好的选择吗?

def subprocess_cmd(command):
   process=subprocess.Popen(command,stdin=subprocess.PIPE,stderr=subprocess.STDOUT,stdout=subprocess.PIPE, shell=True)

for cmd in ['python3 -u tcp_server.py 123 port1']:
    subprocess_cmd(cmd)

process.stdin.write('command like print_list')
process.stdin.flush()
while True:
  line=process.stdout.readline()
  if line == '':
        break

【问题讨论】:

  • 您必须发布您的代码,以便我们提供帮助。
  • @Jean-FrançoisFabre 代码已添加

标签: python python-3.x subprocess


【解决方案1】:

readline 挂起,因为您的 TCP 连接仍处于打开状态,readline 预计会有更多数据进入。您必须从服务器端关闭连接以通知 readline 没有更多内容可读取。通常它是通过关闭客户端的套接字来通知服务器不会再有任何请求来完成的。当服务器完成处理所有命令时,它也会关闭套接字。这表明您已收到服务器发送给您的所有数据。

或者,或者,如果您不想关闭连接,则必须发明将标记响应结束的分隔符。因此,当读取此类分隔符时,客户端将停止调用readline

【讨论】:

  • 你说得对,我也有同样的感觉。但是请阅读我的编辑,如果我能做些什么,请告诉我?
  • 根据您的代码,tcp_server.py 不是 TCP 服务器。至少您使用标准输入/输出流与它通信,而不是 TCP。无论如何,原因是一样的:你没有关闭标准输入。最好的方法是使用subprocess.communicate。原因在函数的文档中有所描述。
猜你喜欢
  • 2011-09-11
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多