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)
解决建议
降级Python版本
Python 3.13属于较新版本,pyairtable可能未完全适配。尝试降级到Python 3.12或3.11,重新安装依赖后测试。指定pyairtable兼容版本
当前pyairtable版本可能与Python 3.13存在兼容性问题,安装稳定兼容版本:
pip uninstall pyairtable pip install pyairtable==2.0.0
- 调整pydantic版本
错误出在pydantic模型构建阶段,确保版本与pyairtable兼容:
pip install pydantic==2.5.0
- 直接导入子模块
绕过顶层导入的循环问题,直接从子模块导入Table:
from pyairtable.api.table import Table
- 清理缓存并重装依赖
pip cache purge pip uninstall -y pyairtable python-dotenv pip install pyairtable python-dotenv
内容的提问来源于stack exchange,提问作者FieldPilot 25
相关产品推荐
相关产品推荐

