如何判断Python程序是否有可以从stdin读取的内容?

3 投票
2 回答
5567 浏览
提问于 2025-04-16 11:28

我正在用Python写一个聊天程序,这个程序需要在接受用户输入之前先连接到服务器。如果连接失败,程序就会退出。

当我从命令行运行这个程序时,如果连接失败,而在尝试连接的时候有输入被发送,那么在程序退出后,这些输入会被显示在命令行上:

jtink@gab-dec:~$ python chat.py
attempting to connect...
Hey there!        # This is user input
How are you?      # This is more user input
connection failed
jtink@gab-dec:~$ Hey there!
Hey there!: command not found
jtink@gab-dev:~$ How are you?
How are you?: command not found
jtink@gab-dev:~$

有没有办法判断sys.stdin上是否还有输入,这样我就可以在聊天程序退出之前读取这些输入?

我看过这个类似的问题,但里面的回答只讲了如何判断是否有输入被传送到Python程序,而不是如何判断是否还有输入。

2 个回答

3

这个问题有两种常见的解决办法:

  • 第一种是,当你因为无法连接到服务器而退出时,先读取标准输入(stdin)中剩下的内容,然后把它丢掉。这样可以解决你今天面临的直接问题,但只解决了一种情况。

  • 第二种(更好的办法)是设置一个真正的事件循环,这样连接服务器的过程就可以在“后台”进行,也就是说你的程序可以一边尝试连接服务器,一边继续读取标准输入。如果你需要在连接意外断开时重新连接服务器,这种方法会更适合你。

3

我觉得你需要看看这个StackOverflow上的问题,关于在标准输入(stdin)上进行非阻塞输入/输出的内容。这里有个链接:在Python中对subprocess.PIPE进行非阻塞读取

撰写回答