从setuptools迁移至Poetry:脚本识别与包数据配置问题
问题描述
将Python项目从setuptools迁移至Poetry后,遇到两个核心问题:
- 原CLI脚本
my_amazin_func无法被识别,执行时提示找不到命令 - 无法像setuptools的
package_data那样,将指定目录下的非代码文件(my_package/merge/*.sh)正确打包到安装包中
原setuptools的setup.py配置:
from setuptools import setup, find_packages version = "1.0.0" setup( name='my_package', version=version, packages=find_packages(), package_data={ 'my_package.merge': ['*.sh'] }, include_package_data=True, url='repo_url', entry_points={ 'console_scripts': [ 'my_amazin_func=my_package.fun:entrypoint' ] } )
当前Poetry的pyproject.toml配置:
[tool.poetry] name = "my package" version = "1.0.0" description = "My Amazing package" authors = ["AAA"] readme = "README.md" include = [ 'my_package/merge/*.sh' ] [tool.poetry.scripts] my_amazin_func = "my_package.fun:entrypoint" [tool.poetry.dependencies] python = ">=3.10.1,<3.11" [tool.flake8] max-line-length = 100 select = ['E9', 'F63', 'F7', 'F82'] count = true show-source = true statistics = true max-complexity = 10 [tool.poetry.group.dev.dependencies] nose = "1.3.7" pytest = "8.1.1" pytest-mock = "3.14.0" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api"
已执行poetry install,但虚拟环境中无对应脚本。
解决方案
一、修复CLI脚本无法识别的问题
1. 修正项目名称
当前pyproject.toml中name字段为"my package"(带空格),与原setup.py的my_package不一致,会导致Poetry生成脚本路径异常。将名称改为无空格格式:
[tool.poetry] name = "my_package"
2. 验证脚本配置与模块路径
确保my_package.fun模块存在,且entrypoint是可直接调用的函数(无语法错误、依赖缺失)。确认项目结构符合预期:
my_package/ ├── __init__.py ├── fun.py # 包含entrypoint函数 └── merge/ ├── __init__.py └── *.sh
3. 正确调用脚本
- 未激活虚拟环境时,直接执行:
poetry run my_amazin_func - 激活虚拟环境后(执行
poetry shell),可直接输入my_amazin_func执行
4. 重新安装生效
执行以下命令同步配置并重新安装:
poetry install --sync
二、正确包含非代码文件(替代setuptools的package_data)
Poetry推荐使用tool.poetry.package-data配置指定包内数据文件,逻辑与setuptools的package_data一致,而非全局include字段:
1. 修改pyproject.toml配置
移除原include字段,添加package-data配置:
[tool.poetry] # 保留其他字段,删除include部分 [tool.poetry.package-data] "my_package.merge" = ["*.sh"]
2. 确保目录被识别为包
my_package/merge目录下必须存在__init__.py文件(即使是空文件),Poetry才会将该目录视为包的一部分,正确打包其中的.sh文件。
3. 验证打包结果
执行构建命令,检查生成的包是否包含目标文件:
poetry build
查看dist/目录下的wheel包,确认my_package/merge/下的.sh文件已被包含。
内容的提问来源于stack exchange,提问作者Nadav
相关产品推荐
相关产品推荐

