Python CLI项目入口点配置报错:ModuleNotFoundError问题排查
核心错误原因
main.py中的导入语句写法错误:
from menu import menu
这是全局模块的导入方式,当项目安装到site-packages后,Python会在全局模块路径查找menu,而你的menu.py属于my_project包的子模块,无法被全局路径识别。
修复步骤
修改main.py的导入语句,二选一即可:
方式1:绝对导入(推荐)
用完整的包路径导入子模块,清晰明确:
from my_project.menu import menu def main(): menu() if __name__ == "__main__": main()
方式2:相对导入
使用相对路径表示当前包内的模块(注意开头的.):
from .menu import menu def main(): menu() if __name__ == "__main__": main()
额外的配置优化建议
修复setup.py的语法错误
setup()函数中long_description_content_type="text/markdown"后面缺少逗号,会导致打包失败,补充后:setup( name='My_project', version='0.0.1', author='John Doe', author_email='John.doe@test.com', license='MIT', description='CLI application.', long_description=long_description, long_description_content_type="text/markdown", # 补充缺失的逗号 install_requires=requirements, python_requires='>=3.10', packages=find_packages(), classifiers=[ "Programming Language :: Python :: 3.10", "Operating System :: OS Independent", ], entry_points={ 'console_scripts': [ 'my_project=my_project.main:main' ] }, )正确读取requirements.txt
当前读取requirements的方式会把整个文件转为单个字符串,不符合install_requires需要的列表格式,修改为:with open("requirements.txt", "r", encoding="utf-8") as fh: requirements = [line.strip() for line in fh if line.strip() and not line.startswith('#')]统一配置文件
setup.py和setup.cfg中都配置了包名、版本和入口点,建议保留其中一个(推荐用setup.cfg,更简洁易维护),删除重复配置避免冲突。
验证修复
修改后重新执行打包和安装:
python -m build pip install dist/My_project-0.0.1-py3-none-any.whl --upgrade
再运行my_project命令即可正常执行。
内容的提问来源于stack exchange,提问作者lyon
相关产品推荐
相关产品推荐

