You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从setuptools迁移至Poetry:脚本识别与包数据配置问题

问题描述

将Python项目从setuptools迁移至Poetry后,遇到两个核心问题:

  1. 原CLI脚本my_amazin_func无法被识别,执行时提示找不到命令
  2. 无法像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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:11:02