最近,我学习了一个关于如何为我的discord.py bot创建超时函数的教程,以便其中一个命令不会占用bot太长时间。该命令使用另一个脚本文件,该脚本文件在bot.py
代码的顶部导入。当我使用py bot.py
在本地运行bot时,超时工作。但是,当我在Heroku举办机器人,命令不起作用。我查看了一下是否有错误,然后使用heroku run bash
和python 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。
it
是InterruptableThread
的对象,继承自threading.Thread
。Thread
类没有任何名为isAlive
的属性,而是有一个名为is_alive
的属性。
将it.isAlive
改为it.is_alive
。
注意python方法名通常是使用snake_case并使用PascalCase作为类名