Ubuntu18.04+Python3.6导入python-telegram-bot遇TypeError求助
问题:Python3.6 + python-telegram-bot 13.12 在Ubuntu18.04下启动报错
环境信息
- 系统:
ubuntu 18.04.6 LTS - Python版本:
Python 3.6.9 - 依赖库版本:
python-telegram-bot-13.12
此前在Ubuntu20+Python3.7环境下代码运行正常,适配Ubuntu18时持续触发相同错误。
错误信息
skye@ubuntu:~$ /usr/bin/python3 /home/skye/Desktop/bot.py Traceback (most recent call last): File "/home/skye/Desktop/bot.py", line 2, in <module> from telegram.ext import Updater, CommandHandler, MessageHandler, CallbackContext, Filters File "/home/skye/.local/lib/python3.6/site-packages/telegram/ext/__init__.py", line 31, in <module> from .updater import Updater File "/home/skye/.local/lib/python3.6/site-packages/telegram/ext/updater.py", line 55, in <module> class Updater(Generic[CCT, UD, CD, BD]): File "/home/skye/.local/lib/python3.6/site-packages/telegram/ext/updater.py", line 198, in Updater dispatcher: Dispatcher[CCT, UD, CD, BD] = None, File "/usr/lib/python3.6/typing.py", line 682, in inner return func(*args, **kwds) File "/usr/lib/python3.6/typing.py", line 1143, in __getitem__ orig_bases=self.__orig_bases__) File "/usr/lib/python3.6/typing.py", line 978, in __new__ self = super().__new__(cls, name, bases, namespace, _root=True) File "/usr/lib/python3.6/typing.py", line 137, in __new__ return super().__new__(cls, name, bases, namespace) File "/usr/lib/python3.6/abc.py", line 133, in __new__ cls = super().__new__(mcls, name, bases, namespace, **kwargs) TypeError: __dict__ slot disallowed: we already got one
代码示例
from telegram import Update from telegram.ext import Updater, CommandHandler, MessageHandler, CallbackContext, Filters import mysql.connector from datetime import datetime import re TOKEN = '' db_connection = mysql.connector.connect( host='localhost', user='213', password='11111', database='bot_database' ) db_cursor = db_connection.cursor() db_cursor.execute(''' CREATE TABLE IF NOT EXISTS subscribers ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, username VARCHAR(255), first_name VARCHAR(255), last_name VARCHAR(255) ) ''') db_connection.commit() db_cursor.execute(''' CREATE TABLE IF NOT EXISTS user_logs ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, username VARCHAR(255), first_name VARCHAR(255), action_type VARCHAR(255), action_text TEXT, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ''') db_connection.commit() def start(update: Update, context: CallbackContext) -> None: user = update.effective_user user_id = user.id user_logs = get_user_logs(user_id) with db_connection.cursor() as db_cursor: db_cursor.execute('SELECT * FROM subscribers WHERE user_id = %s', (user_id,)) existing_user = db_cursor.fetchone() if not existing_user: db_cursor.execute(''' INSERT INTO subscribers (user_id, username, first_name, last_name) VALUES (%s, %s, %s, %s) ''', (user_id, user.username, user.first_name, user.last_name)) db_connection.commit() update.message.reply_markdown_v2( fr'Привет, {user.mention_markdown_v2()}\!', reply_markup=None ) def log_user_action(update: Update, context: CallbackContext) -> None: user = update.effective_user user_id = user.id username = user.username first_name = user.first_name action_text = update.message.text.lstrip() if action_text.startswith("/"): action_type = "command" action_text = re.sub('^/', '', action_text) else: action_type = "message" with db_connection.cursor() as db_cursor: db_cursor.execute(''' INSERT INTO user_logs (user_id, username, first_name, action_type, action_text, timestamp) VALUES (%s, %s, %s, %s, %s, %s) ''', (user_id, username, first_name, action_type, action_text, datetime.now())) db_connection.commit() def get_user_logs(user_id): with db_connection.cursor() as db_cursor: db_cursor.execute(''' SELECT * FROM user_logs WHERE user_id = %s ORDER BY timestamp DESC ''', (user_id,)) user_logs = db_cursor.fetchall() columns = [column[0] for column in db_cursor.description] user_logs_dict = [] for log in user_logs: log_dict = dict(zip(columns, log)) user_logs_dict.append(log_dict) return user_logs_dict def test_command(update, context): update.message.reply_text('тестовая команда!') def test1(update, context): if update.message: image_url = 'https://www.rainforest-alliance.org/wp-content/uploads/2021/06/capybara-square-1.jpg.optimal.jpg' context.bot.send_photo(chat_id=update.message.chat_id, photo=image_url, caption='Это тестовая картинка.') def main() -> None: updater = Updater(TOKEN) dp = updater.dispatcher dp.add_handler(CommandHandler("start", start)) dp.add_handler(CommandHandler("test", test_command)) dp.add_handler(CommandHandler("test1", test1)) dp.add_handler(MessageHandler(Filters.update.message & ~Filters.command, log_user_action)) updater.start_polling() updater.idle() if __name__ == '__main__': main()
已尝试的解决方法
- 重新安装
python-telegram-bot - 更换不同版本的
python-telegram-bot - 尝试使用其他替代库
- 调整导入语句,减少潜在冲突
推测问题根源是Python3.6与python-telegram-bot版本不兼容,但Ubuntu18.04无法直接升级到Python3.7,且必须使用系统原生组件,求可行解决方案。
内容的提问来源于stack exchange,提问作者skye
相关产品推荐
相关产品推荐

