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

Django项目中pyairtable循环导入引发AttributeError问题求助

问题:pyairtable 循环导入导致 AttributeError 错误

背景

正在开发基于Django的数据库管理器,计划用Airtable替代JSON存储数据,但运行脚本时持续报错:

AttributeError: partially initialized module 'pyairtable' from 'C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\site-packages\pyairtable\__init__.py' has no attribute 'api' (most likely due to a circular import)

已排查操作

  • 确认pyairtable、python-dotenv包安装正确
  • 排查过脚本文件名与包名冲突问题(无同名文件)
  • 尝试过直接硬编码Token和os.getenv()读取两种方式(Token拥有Airtable全权限)
  • 运行极简测试脚本仍报错,测试脚本如下(已补充原脚本遗漏的关键代码):
from pyairtable import Table
from dotenv import load_dotenv, find_dotenv
import os

load_dotenv(find_dotenv())
AT = os.getenv('AIRTABLE_TOKEN')
BI = os.getenv('BASE_ID')

RC_table = Table(AT, BI, 'RC')
LB_table = Table(AT, BI, 'L&B')
PM_table = Table(AT, BI, 'PM')
print("Table imported and initialized successfully!")

完整错误回溯

Traceback (most recent call last):
  File "C:\Users\PC\Desktop\teat.py", line 1, in <module>
    from pyairtable import Table
  File "C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\site-packages\pyairtable\__init__.py", line 3, in <module>
    from .api import Api, Base, Table
  File "C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\site-packages\pyairtable\api\__init__.py", line 1, in <module>
    from .api import Api
  File "C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\site-packages\pyairtable\api\api.py", line 9, in <module>
    from pyairtable.api.enterprise import Enterprise
  File "C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\site-packages\pyairtable\api\enterprise.py", line 8, in <module>
    from pyairtable.models._base import AirtableModel, rebuild_models
  File "C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\site-packages\pyairtable\models\__init__.py", line 17, in <module>
    from .comment import Comment
  File "C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\site-packages\pyairtable\models\comment.py", line 10, in <module>
    class Comment(
    ...<58 lines>...
        reactions: List["Reaction"] = pydantic.Field(default_factory=list)
  File "C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\site-packages\pydantic\_internal\_model_construction.py", line 221, in __new__
    set_model_fields(cls, bases, config_wrapper, ns_resolver)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\site-packages\pydantic\_internal\_model_construction.py", line 593, in set_model_fields
    fields, class_vars = collect_model_fields(cls, bases, config_wrapper, ns_resolver, typevars_map=typevars_map)
                         ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\site-packages\pydantic\_internal\_fields.py", line 112, in collect_model_fields
    type_hints = _typing_extra.get_cls_type_hints(cls, ns_resolver=ns_resolver, lenient=True)
  File "C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\site-packages\pydantic\_internal\_typing_extra.py", line
 472, in get_cls_type_hints
    hints[name] = eval_type(value, globalns, localns, lenient=lenient)
                  ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\site-packages\pydantic\_internal\_typing_extra.py", line
 498, in eval_type
    return eval_type_backport(value, globalns, localns)
  File "C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\site-packages\pydantic\_internal\_typing_extra.py", line
 534, in eval_type_backport
    return _eval_type_backport(value, globalns, localns, type_params)
  File "C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\site-packages\pydantic\_internal\_typing_extra.py", line
 558, in _eval_type_backport
    return _eval_type(value, globalns, localns, type_params)
  File "C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\site-packages\pydantic\_internal\_typing_extra.py", line
 588, in _eval_type
    return typing._eval_type(  # type: ignore
           ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        value, globalns, localns, type_params=type_params
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\typing.py", line 474, in _eval_type
    return t._evaluate(globalns, localns, type_params, recursive_guard=recursive_guard)
           ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\typing.py", line 1081, in _evaluate
    eval(self.__forward_code__, globalns, localns),
    ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<string>", line 1, in <module>
AttributeError: partially initialized module 'pyairtable' from 'C:\Users\PC\AppData\Local\Programs\Python\Python313\Lib\site-packages\pyairtable\__init__.py' has no attribute 'api' (most likely due to a circular import)

解决建议

  1. 降级Python版本
    Python 3.13属于较新版本,pyairtable可能未完全适配。尝试降级到Python 3.12或3.11,重新安装依赖后测试。

  2. 指定pyairtable兼容版本
    当前pyairtable版本可能与Python 3.13存在兼容性问题,安装稳定兼容版本:

pip uninstall pyairtable
pip install pyairtable==2.0.0
  1. 调整pydantic版本
    错误出在pydantic模型构建阶段,确保版本与pyairtable兼容:
pip install pydantic==2.5.0
  1. 直接导入子模块
    绕过顶层导入的循环问题,直接从子模块导入Table:
from pyairtable.api.table import Table
  1. 清理缓存并重装依赖
pip cache purge
pip uninstall -y pyairtable python-dotenv
pip install pyairtable python-dotenv

内容的提问来源于stack exchange,提问作者FieldPilot 25

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:05:05