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

求助:执行setup.py install无法将etc目录复制到安装路径

解决etc目录无法随setup.py install复制的问题

核心问题

include_package_data=True仅处理Python包(即src/my-app下的文件)内的数据,根目录的etc不属于任何包,因此即使MANIFEST.in配置正确,也不会自动安装到目标路径。另外你的配置还存在两处细节错误:

  1. Python包名不能包含横杠,src/my-app需改名为src/my_app,对应entry_points里的my-app.main要改为my_app.main,否则会导致导入失败。
  2. MANIFEST.in里匹配的是*.yml,但实际文件是config.yaml,后缀不匹配,需修正为*.yaml。

解决方案

方案一:使用data_files参数(推荐,无需调整目录结构)

修改setup.py,添加data_files参数指定文件安装路径:

import setuptools
import os

# 递归收集etc目录下的所有文件
etc_files = []
for root, _, files in os.walk('etc'):
    for file in files:
        etc_files.append(os.path.join(root, file))

setuptools.setup(
    name='my-app',
    version='0.1',
    package_dir=("", "src"),
    packages=setuptools.find_packages("src"),
    include_package_data=True,
    # 第一个元素是安装后的目标路径(相对于sys.prefix),第二个是源文件列表
    data_files=[('etc/my-app', etc_files)],
    entry_points={
        "console_scripts": [
            "my_main = my_app.main:main"  # 修正包名为下划线格式
         ]
    })

执行安装前先清理缓存:

python setup.py clean --all
python setup.py install

方案二:将etc目录移入包内(适合包内数据场景)

  1. 调整目录结构:将etc移到src/my_app下,结构变为:
├── setup.py
├── MANIFEST.in
└── src/
    └── my_app/
        ├── __init__.py
        ├── main.py
        └── etc/
            ├── config.yaml
            └── message.xml
  1. 修改MANIFEST.in:
recursive-include src/my_app/etc *.yaml *.xml
  1. 保持setup.py中include_package_data=True,安装后文件会出现在site-packages/my_app/etc路径下。

方案三:使用package_data参数(替代MANIFEST.in)

如果不想维护MANIFEST.in,可在setup.py中直接指定包内数据(需先将etc移入包内):

setuptools.setup(
    # ...其他参数
    package_data={
        'my_app': ['etc/*.yaml', 'etc/*.xml'],
    },
    include_package_data=True,
)

内容的提问来源于stack exchange,提问作者tempuser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:36:59