You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:35:54