setup.py提示mydogs模块已安装,但Python无法导入该模块的问题
问题原因与解决方法
核心问题
你在setup.py里用py_modules=['junie', 'lucy']声明的是两个独立的顶层模块,而非名为mydogs的Python包。安装完成后,Python只能识别junie和lucy这两个单独模块,所以直接import mydogs会提示找不到模块。
解决办法
方法1:直接使用已安装的模块
既然安装的是独立模块,直接导入junie或lucy就能正常调用:
>>> import junie >>> junie.junie() Junie says hi >>> import lucy >>> lucy.lucy() Lucy says hi
方法2:改成标准包结构(推荐)
如果希望通过import mydogs来统一使用这两个模块,需要调整为标准Python包结构:
- 重构目录结构:
root |- setup.py |- mydogs/ |- __init__.py |- junie.py |- lucy.py
- 修改
setup.py,把py_modules替换为packages参数:
# setup.py from distutils.core import setup setup( name='mydogs', version='1.0', packages=['mydogs'] )
- (可选)在
mydogs/__init__.py中导出模块函数,简化调用:
# mydogs/__init__.py from .junie import junie from .lucy import lucy
- 用现代工具重新安装(替代已废弃的
setup.py install):
# 先卸载旧版本 pip uninstall mydogs # 本地安装包 pip install .
之后就能正常导入mydogs并使用:
>>> import mydogs >>> mydogs.junie() Junie says hi >>> mydogs.lucy() Lucy says hi
方法3:不调整目录的折中方案(不推荐)
如果不想改目录结构,也可以在setup.py中添加packages配置,同时创建mydogs/__init__.py文件,但这种方式不够规范,长期维护容易出问题:
# setup.py from distutils.core import setup setup( name='mydogs', version='1.0', py_modules=['junie', 'lucy'], packages=['mydogs'] )
本质还是依赖包结构,不如直接改成标准结构清晰。
额外提醒
安装日志里已经明确提示setup.py install已被废弃,建议使用pip install .或者python -m build生成wheel包后再用pip install dist/*.whl的方式安装,避免兼容性问题。
内容的提问来源于stack exchange,提问作者krc
相关产品推荐
相关产品推荐

