Heroku bot 属性错误:线程对象没有属性'isAlive'



最近,我学习了一个关于如何为我的discord.py bot创建超时函数的教程,以便其中一个命令不会占用bot太长时间。该命令使用另一个脚本文件,该脚本文件在bot.py代码的顶部导入。当我使用py bot.py在本地运行bot时,超时工作。但是,当我在Heroku举办机器人,命令不起作用。我查看了一下是否有错误,然后使用heroku run bashpython bot.py,当我在Discord上输入命令时,它产生了这个错误:

Ignoring exception in command calculator:
Traceback (most recent call last):
(traceback...)
AttributeError: 'InterruptableThread' object has no attribute 'isAlive'
The above exception was the direct cause of the following exception:
(more traceback...)

timeout函数使用threading库。下面是timeout函数的代码:

def timeout(func, args=(), kwargs={}, timeout_duration=1, default=None):
class InterruptableThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.result = None
def run(self):
try:
self.result = func(*args, **kwargs)
except:
self.result = default
it = InterruptableThread()
it.start()
it.join(timeout_duration)
if it.isAlive():
raise TimeLimitExpired()
else:
return it.result

我从教程中得到了这个。我通过

来使用超时函数
timeout(interpreter.visit, (ast.node, context), timeout_duration=TIMEOUT, 
default=RuntimeResult().failure("Execution timed out."))

,变量TIMEOUT为5。我正在使用Windows 10和Windows Store中的Python。

itInterruptableThread的对象,继承自threading.ThreadThread类没有任何名为isAlive的属性,而是有一个名为is_alive的属性。

it.isAlive改为it.is_alive

注意python方法名通常是使用snake_case并使用PascalCase作为类名

相关内容

  • 没有找到相关文章

最新更新