如何通过pyproject.toml将多级目录完整打包进Python项目myproj
解决方案
要将algorithms和configs目录完整打包进myproj包中,有两种可行方案,推荐优先使用符合Python打包规范的目录调整方案:
方案一:调整目录结构(推荐)
这是最符合Python打包规范的做法,将数据目录纳入包源码结构内:
- 调整目录位置
将根目录下的algorithms和configs文件夹移动到src/myproj目录下,调整后的项目结构如下:
myproj/ src/ myproj/ dosomething.py algorithms/ Type1/ algorithm1/ eval.py hyperparameters.yml ... algorithm2/ ... Type2/ ... configs/ type1.yml type2.yml tests/ test_do_something.py pyproject.toml mypy.ini tox.ini run-mypy
- 修改pyproject.toml
添加[tool.setuptools]配置段,开启自动包含包内数据文件:
[build-system] requires = ["setuptools >= 61.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "myproj" version = "0.0.1" readme = "README.md" dependencies = [ "numpy >= 1.26.4", ] [project.urls] repository = "https://gitlab.com/somerepo" # 补全闭合引号 [project.optional-dependencies] dev = [ "tox", "pytest", "pytest-sugar", "pytest-cov", "black", "flake8", "flake8-docstrings", "mypy", "pre-commit", "sphinx", "sphinx-rtd-theme" ] [tool.setuptools] include-package-data = true
方案二:不调整目录,通过配置映射
如果不想改动现有目录结构,可通过setuptools的配置将外部目录映射到包内:
- 创建MANIFEST.in文件
在项目根目录新建MANIFEST.in,内容如下:
recursive-include algorithms * recursive-include configs *
- 修改pyproject.toml
添加[tool.setuptools]配置段,指定包数据映射规则:
[build-system] requires = ["setuptools >= 61.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "myproj" version = "0.0.1" readme = "README.md" dependencies = [ "numpy >= 1.26.4", ] [project.urls] repository = "https://gitlab.com/somerepo" # 补全闭合引号 [project.optional-dependencies] dev = [ "tox", "pytest", "pytest-sugar", "pytest-cov", "black", "flake8", "flake8-docstrings", "mypy", "pre-commit", "sphinx", "sphinx-rtd-theme" ] [tool.setuptools] package-dir = { "myproj" = "src/myproj" } packages = ["myproj"] package-data = { "myproj": [ "../../algorithms/**/*", "../../configs/**/*" ] } include-package-data = true
验证安装
在测试conda环境中执行:
pip install .
安装完成后检查env/test_env/lib/python3.9/site-packages/myproj目录,即可看到algorithms、configs和dosomething.py共存的结构。
内容的提问来源于stack exchange,提问作者lr100
相关产品推荐
相关产品推荐

