Python自定义模块导入失败:Flask项目中UsefulDeveloperTools报错排查
问题描述
我在Flask开发的应用中使用了自行开发的UsefulDeveloperTools包,将其发布到TestPyPI后,在虚拟环境中完成安装。运行main.py时,导入该包的语句抛出ModuleNotFoundError。
包的目录结构
. ├── __init__.py ├── threads.py └── IDgenerator.py
包的__init__.py代码
""" Useful Tools. """ import threads import IDgenerator
安装命令
python3 -m pip install --upgrade --index-url https://test.pypi.org/simple/ --no-deps UsefulDeveloperTools
main.py关键代码
import flask from threading import Thread import time import random import UsefulDeveloperTools # 此处报错 import logging app=flask.Flask(__name__) # 无关代码省略
报错信息
(Blog) phao@phao-virtual-machine:~/桌面/pypoj/Blog$ python3 main.py Traceback (most recent call last): File "/home/phao/桌面/pypoj/Blog/main.py", line 5, in <module> import UsefulDeveloperTools File "/home/phao/桌面/pypoj/Blog/lib/python3.10/site-packages/UsefulDeveloperTools/__init__.py", line 5, in <module> import threads ModuleNotFoundError: No module named 'threads'
虚拟环境已安装包列表
(Blog) phao@phao-virtual-machine:~/桌面/pypoj/Blog$ pip list Package Version -------------------- ------- click 8.1.3 Flask 2.2.2 itsdangerous 2.1.2 Jinja2 3.1.2 Markdown 3.4.1 MarkupSafe 2.1.1 pip 22.3.1 setuptools 59.6.0 UsefulDeveloperTools 0.2.2 Werkzeug 2.2.2
报错原因
__init__.py中使用了import threads这种绝对导入方式,但当包被安装到Python的site-packages目录后,Python会将UsefulDeveloperTools视为独立命名空间。此时直接import threads会让Python去全局模块路径中查找,而非在UsefulDeveloperTools包内部查找,导致找不到模块。
解决方法
方案1:使用相对导入修改__init__.py
将__init__.py中的导入语句改为相对导入,明确引用包内的子模块:
""" Useful Tools. """ from . import threads from . import IDgenerator
方案2:使用包前缀的绝对导入
也可以通过包名前缀明确指定模块位置,避免全局查找:
""" Useful Tools. """ # 方式一:保留模块路径引用 import UsefulDeveloperTools.threads import UsefulDeveloperTools.IDgenerator # 方式二:直接导入模块到当前命名空间 from UsefulDeveloperTools import threads, IDgenerator
后续操作
修改完__init__.py后,需要重新打包并更新TestPyPI上的包,再在虚拟环境中重新安装:
# 重新打包(需确保已安装build工具) python3 -m build # 上传更新后的包到TestPyPI twine upload --repository testpypi dist/* # 在虚拟环境中重新安装最新版本 python3 -m pip install --upgrade --index-url https://test.pypi.org/simple/ --no-deps UsefulDeveloperTools
内容的提问来源于stack exchange,提问作者phao
相关产品推荐
相关产品推荐

