求助:执行setup.py install无法将etc目录复制到安装路径
解决etc目录无法随setup.py install复制的问题
核心问题
include_package_data=True仅处理Python包(即src/my-app下的文件)内的数据,根目录的etc不属于任何包,因此即使MANIFEST.in配置正确,也不会自动安装到目标路径。另外你的配置还存在两处细节错误:
- Python包名不能包含横杠,
src/my-app需改名为src/my_app,对应entry_points里的my-app.main要改为my_app.main,否则会导致导入失败。 - 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目录移入包内(适合包内数据场景)
- 调整目录结构:将
etc移到src/my_app下,结构变为:
├── setup.py ├── MANIFEST.in └── src/ └── my_app/ ├── __init__.py ├── main.py └── etc/ ├── config.yaml └── message.xml
- 修改MANIFEST.in:
recursive-include src/my_app/etc *.yaml *.xml
- 保持
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
相关产品推荐
相关产品推荐

