Python:如何在无限循环运行时从控制台获取输入?

Python:如何在无限循环运行时从控制台获取输入?,python,loops,input,Python,Loops,Input,我正在尝试编写一个简单的Python IRC客户端。到目前为止,我可以读取数据,如果客户机是自动的,我可以将数据发送回客户机。我在一个中获取数据,而为True,这意味着我不能在读取数据的同时输入文本。我如何在控制台中输入文本,只有当我按enter键时才会发送文本,同时运行无限循环 基本代码结构: while True: read data #here is where I want to write data only if it contains '/r' in it 您需要

我正在尝试编写一个简单的Python IRC客户端。到目前为止,我可以读取数据,如果客户机是自动的,我可以将数据发送回客户机。我在一个
中获取数据,而为True
,这意味着我不能在读取数据的同时输入文本。我如何在控制台中输入文本,只有当我按enter键时才会发送文本,同时运行无限循环

基本代码结构:

while True:
    read data
    #here is where I want to write data only if it contains '/r' in it

您需要的是某种类型的事件循环

在Python中,您有几个选项可以执行此操作,请选择一个您喜欢的选项:

  • 扭曲的
  • 异步
  • 格温特
诸如此类,有数百个框架用于此,您也可以使用任何GUI框架,如tkinter或PyQt来获取主事件循环


正如上面的评论所说,您可以使用线程和一些队列来处理这个问题,也可以使用基于事件的循环、协同路由或其他一些体系结构。根据您的目标平台,其中一个可能是最好的。例如,在windows上,控制台API与unix PTY完全不同。特别是如果你以后需要像颜色输出之类的东西,你可能想问更具体的问题

您可以使用异步库(参见schlenk的答案)或

此模块提供对select()和poll()函数的访问 在大多数操作系统中可用,Linux 2.5上提供了epoll()+ 和kqueue()在大多数BSD上可用。请注意,在Windows上,它仅 插座工程;在其他操作系统上,它也适用于其他操作系统 文件类型(特别是在Unix上,它在管道上工作)。不可能 用于常规文件,以确定文件自创建以来是否已增长 这是最后一次阅读


另一种方法是线程

import threading

# define a thread which takes input
class InputThread(threading.Thread):
    def __init__(self):
        super(InputThread, self).__init__()
        self.daemon = True
        self.last_user_input = None

    def run(self):
        while True:
            self.last_user_input = input('input something: ')
            # do something based on the user input here
            # alternatively, let main do something with
            # self.last_user_input

# main
it = InputThread()
it.start()
while True:
    # do something  
    # do something with it.last_user_input if you feel like it

我不知道你想做什么,但线程可能很有用。我基本上希望能够在控制台中输入文本,同时从无限循环中读取数据。一个线程应该等待用户输入,并在新数据可用时将其复制到线程安全的对象(可能是队列)。其他线程轮询安全对象并处理新数据(如果可用)。我应该强调Windows的这一特定限制:
select()
对标准输入不起作用,除非标准输入是套接字(可以完成,但不太可能)。
原始输入可能是正确的。我想我可以用它。谢谢:)@Shef-Ah是的,我的示例代码是Python3,您可能正在使用使用原始输入的旧版本。