使用setup.py构建Python包时遭遇ImportError问题求助
解决Python包console_scripts入口点模块找不到问题
问题描述
我正在尝试使用setup.py构建一个Python包,已设置console_scripts入口点play=treasurehunt:main,但运行play命令时出现模块找不到错误,而在VS Code中直接运行代码则无此问题。
项目目录结构
C:. │ setup.py │ ├───build │ ├───bdist.win-amd64 │ └───lib │ └───treasure_hunt │ death.py │ energy.py │ map.py │ path_scenes.py │ scenes.py │ setup.py │ treasurehunt.py │ __init__.py │ ├───treasure_hunt │ │ death.py │ │ energy.py │ │ map.py │ │ path_scenes.py │ │ scenes.py │ │ setup.py │ │ treasurehunt.py │ │ __init__.py │ │ │ ├───treasure_hunt.egg-info │ │ dependency_links.txt │ │ entry_points.txt │ │ PKG-INFO │ │ SOURCES.txt │ │ top_level.txt │ │ │ └───__pycache__ │ death.cpython-310.pyc │ energy.cpython-310.pyc │ energy.cpython-312.pyc │ map.cpython-310.pyc │ path_scenes.cpython-310.pyc │ scenes.cpython-310.pyc │ treasurehunt.cpython-312.pyc │ __init__.cpython-312.pyc │ └───treasure_hunt.egg-info dependency_links.txt entry_points.txt PKG-INFO SOURCES.txt top_level.txt
现有setup.py代码
try : from setuptools import setup except: from distutils.tools import setup config = { "packages":["treasure_hunt"], "entry_points":{ "console_scripts":"play=treasurehunt:main" } } setup(**config)
包含main()的treasurehunt.py代码
def main(): from .energy import Energy from .scenes import * from .path_scenes import * scene_map = { "scene1":scenes.Scene1(), "scene2":scenes.Scene2(), "scene3":scenes.Scene3(), "scene4":scenes.Scene4(), "scene5":scenes.Scene5(), "scene6":scenes.Scene6(), } path_scene_map = { "scene1":path_scenes.Pathscene4(), "scene3":path_scenes.Pathscene1(), "scene2":path_scenes.Pathscene5(), "scene5":path_scenes.Pathscene3(), "scene4":path_scenes.Pathscene6(), "scene6":path_scenes.Pathscene2(), } name = "scene1" x = Energy() while True: energylevel = x.show() x.warning() path_scene_map[name].path() energylevel = energylevel-1 name = scene_map[name].enter() energylevel = energylevel-1
错误原因及修复方案
核心错误
console_scripts入口点路径错误:treasurehunt.py属于treasure_hunt包的子模块,直接写treasurehunt:main无法让Python找到正确的模块,必须使用完整的包路径treasure_hunt.treasurehunt:main。
修复步骤
修正setup.py配置
修改入口点路径,同时修复distutils的错误导入:try: from setuptools import setup except ImportError: from distutils.core import setup config = { "packages": ["treasure_hunt"], "entry_points": { "console_scripts": "play=treasure_hunt.treasurehunt:main" } } setup(**config)清理冗余文件
删除treasure_hunt子目录下的setup.py,避免包结构混淆。重新安装包
先卸载旧版本(如果已安装):pip uninstall treasure_hunt再用开发模式安装(方便后续修改测试):
pip install -e .验证修复
直接运行play命令,即可正常执行main()函数。
内容的提问来源于stack exchange,提问作者priya yadav
相关产品推荐
相关产品推荐

