在Python模块中运行无限while循环

时间:2019-06-27 20:45:52

标签: python while-loop module

我正在编写一个Python模块来读取jstest输出,并使Xbox游戏手柄在Linux上的Python中运行。我需要在另一个看起来像这样的线程上的__init__中从后台无限while循环开始:

import os
from threading import Thread
import time
import select
import subprocess


class Joystick:
    """Initializes base class and launches jstest and xboxdrv"""
    def __init__(self, refreshRate=2000, deadzone=4000):
        self.proc = subprocess.Popen(['xboxdrv', '-D', '-v', '--detach-kernel-driver', '--dpad-as-button'], stdout=subprocess.PIPE, bufsize=0)
        self.pipe = self.proc.stdout
        self.refresh = refreshRate
        self.refreshDelay = 1.0 / refreshRate
        self.refreshTime = 0  # indicates the next refresh
        self.deadzone = deadzone
        self.start()
        self.xbox = subprocess.Popen(['jstest', '--normal', '/dev/input/js0'], stdout=subprocess.PIPE, bufsize=-1, universal_newlines=True)
        self.response = self.xbox.stdout.readline()
        a = Thread(target=self.reload2())
        a.start()
        print("working")

    def reload2(self):
        while True:
            self.response = self.xbox.stdout.readline()
            print("read")
            time.sleep(0.5)

    def start(self):
        global leftVibrateAmount, rightVibrateAmount
        leftVibrateAmount = 0
        rightVibrateAmount = 0
        readTime = time.time() + 1  # here we wait a while
        found = False
        while readTime > time.time() and not found:
            readable, writeable, exception = select.select([self.pipe], [], [], 0)
            if readable:
                response = self.pipe.readline()
                # tries to detect if controller is connected
                if response == b'[ERROR] XboxdrvDaemon::run(): fatal exception: DBusSubsystem::request_name(): failed to become primary owner of dbus name\n':
                    raise IOError("Another instance of xboxdrv is running.")
                elif response == b'[INFO]  XboxdrvDaemon::connect(): connecting slot to thread\n':
                    found = True
                    self.reading = response
                elif response == b'':
                    raise IOError('Are you running as sudo?')
        if not found:
            self.pipe.close()
            # halt if controller not found
            raise IOError("Xbox controller/receiver isn't connected")

循环被定义为开始在__init__函数中运行,如下所示:

a = threading.Thread(target=self.reload2)  # code hangs here
a.start()

但是每次我创建变量“ a”时,整个程序都会挂在while循环中,该循环应在另一个线程中运行。

感谢帮助。

1 个答案:

答案 0 :(得分:0)

您的__init__可能有问题。我以一个简单的类作为示例,它可以按预期运行。

import time
from threading import Thread


class InfiniteLooper():

    def __init__(self):
        a = Thread(target=self.reload2) # reload, not reload(), otherwise you're executing reload2 and assigning the result to Target, but it's an infinite loop, so... 
        print('Added thread')
        a.start()
        print('Thread started')

    def reload2(self):
        while True:
            self.response = input('Enter something')
            print('read')
            time.sleep(0.5)


loop = InfiniteLooper()

输出:

添加了线程
线程已启动
输入一些东西
1
阅读
输入一些东西
1
阅读

如您所见,在我添加线程并启动它之后,将显示“输入内容”。循环也很好