繁体   English   中英

读取所有输入后 Python 子进程 readline 挂起()

[英]Python Subprocess readline hangs() after reading all input

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

这些解决方案中的大多数建议检查 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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM