Python自定义包执行时出现ModuleNotFoundError的解决方法求助
解决Python包子模块导入失败问题
问题原因
- 导入路径错误:
__main__.py中直接使用from package_a import ...属于顶级模块查找,但package_a是ds包的子模块,Python无法在全局命名空间定位到它。 - 打包配置遗漏子包:
setup.py仅指定packages=["ds"],setuptools只会打包ds根目录,不会自动包含其下的package_a子包和settings.py模块。
解决方案
1. 修正ds/__main__.py的导入语句
有两种可行方式:
方式一:使用绝对导入(推荐)
修改导入代码为带包前缀的绝对路径:
from ds.package_a import name_a from ds.package_a.package_a_b import name_a_b from ds.settings import config def main(): print(name_a) print(config)
方式二:使用相对导入
利用相对路径(.表示当前包目录)导入子模块:
from .package_a import name_a from .package_a.package_a_b import name_a_b from .settings import config def main(): print(name_a) print(config)
2. 修正setup.py的打包配置
需要让setuptools识别并打包所有子包,有两种方式:
方式一:自动发现所有包(推荐)
导入find_packages工具,自动扫描并包含所有子包:
import pathlib from setuptools import setup, find_packages # 新增导入find_packages HERE = pathlib.Path(__file__).parent README = (HERE / "README.md").read_text() setup( name="ds", version="2.0.0", long_description=README, long_description_content_type="text/markdown", license="MIT", classifiers=[ "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.8", ], packages=find_packages(), # 替换原packages配置 include_package_data=True, entry_points={ "console_scripts": [ "ds=ds.__main__:main", ] }, )
方式二:手动列出所有包
如果不想使用自动发现,可手动列出所有需要打包的包:
# ... 其他代码不变 packages=["ds", "ds.package_a", "ds.package_a.package_a_b"], # ... 其他代码不变
3. 重新安装并验证
执行以下命令重新打包安装:
rm -rf dist pip uninstall ds -y python setup.py bdist_wheel pip install dist/ds-2.0.0-py3-none-any.whl --force-reinstall ds
此时执行ds命令即可正常输出name_a和config的内容。
内容的提问来源于stack exchange,提问作者Tlaloc-ES
相关产品推荐
相关产品推荐

