gpt4 book ai didi

python - 在 Python 中一次读取标准输入行

转载 作者:太空狗 更新时间:2023-10-30 00:01:24 24 4
gpt4 key购买 nike

我正在尝试通过发送一系列命令并捕获输出来测试特定的聊天程序。

如何通过:

sleep 2
echo test
sleep 2
echo test1

我试过这个:

(sleep 2; echo test; sleep 2; echo test1) | python3 test.py

但它只打印第一部分,而第二部分我什么也得不到。相反,它进入了一个无限循环。

python程序的代码是:

import sys, select

while True:
socket_list = [sys.stdin]
read_sockets, write_sockets, error_sockets = select.select(socket_list, [], [])
for sock in read_sockets:
message = sys.stdin.readline()
sys.stdout.write("> %s: ")
sys.stdout.flush()

我应该指出,这不是完整的程序,但它是帮助重新创建完全相同效果的部分。

最佳答案

您的示例进入循环,因为在 echo test1 stdin 关闭后并且 read() 始终返回空。此外,您不应该对 select 使用另一个阻塞调用。如果你能在多个对象上使用它,您仍然可能被 readline 阻止来自之前的事件。

要从 stdin 读取一行,你不需要使用选择。选择()。可能是实现该目标的最简单方法:

for line in sys.stdin:
print(line)

如果您想使用 stdin 或文件列表作为参数你的程序,Python的 fileinput模块是开箱即用的解决方案。

如果你想/需要使用 select.select() 无论如何:

import os, sys, select

buffer = ""
while True:
select.select([sys.stdin.fileno()], [], [])
read = os.read(sys.stdin.fileno(), 512)

# empty read: EOF
if len(read) == 0:
# buffer might not be empty
if len(buffer) > 0:
sys.stdout.write(buffer + "\n")

break

# find newlines
parts = read.split("\n")
buffer += parts.pop(0)

while len(parts) > 0:
sys.stdout.write(buffer + "\n")
buffer = parts.pop(0)

当对象准备就绪时, select.select解锁。在这种情况下,唯一的对象是 stdin。不止一个object 你需要检查 select.select 的返回值来找出哪一个准备好了。 os.read() 用于非阻塞读取标准输入(或者:可以使用 stdin.read(1) 一次读取一个字符)。read.split("\n") 用于查找换行符,注意是可能单次读取会产生不止一行。

关于python - 在 Python 中一次读取标准输入行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45983475/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com