使用 pyproject.toml 进行打包,其中将包含其他多级目录

问题描述 投票:0回答:1

我花了整整两天的时间试图解决这个问题,但没有成功。我有一个python项目想要打包。这是最简单的部分。我不明白的部分是如何将其他多级文件夹复制到包中。

我正在尝试将 myproj 作为与 dosomething.py 的包一起获取,但也有 algorithmsconfigs 文件夹(包含文件夹结构和所有文件)。

项目结构:

 - myproj
     - src
         - myproj
             - dosomething.py
     - tests
         - test_do_something.py
     - algorithms
         - Type1
             - algorithm1
                 - eval.py
                 - hyperparameters.yml
                 - a bunch of other folders and files
             - algorithm2
                 - eval.py
                 - hyperparameters.yml
                 - a bunch of other folders and files
         - Type2
             - algorithm3
                 - eval.py
                 - hyperparameters.yml
                 - a bunch of other folders and files
             - algorithm4
                 - eval.py
                 - hyperparameters.yml
                 - a bunch of other folders and files
     - configs
         - type1.yml
         - type2.yml
     - pyproject.toml
     - mypy.ini
     - tox.ini
     - run-mypy

pyproject.toml 的内容:

[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"
]

在新的 conda 环境中进行 pip 安装后,我正在寻找以下内容:

- env/test_env/lib/python3.9/site-packages
    - myproj
        - algorithms and everything under it
        - configs and everything under it
        - dosomething.py

我已经尝试过 MANIFEST.in,我已经尝试了此页面上的所有内容:https://setuptools.pypa.io/en/latest/userguide/datafiles.html

我认为将整个文件夹和文件复制到包文件夹中是微不足道的,但我被难住了。

任何帮助将不胜感激!

python setuptools python-packaging pyproject.toml
1个回答
0
投票

setuptools
自动支持2种标准目录结构,无需额外配置:

  1. 原版
    src-layout
    :总之,无论您在放置什么内容,
    src
    目录都将在安装过程中复制到
    site-packages
  2. 普通版
    flat-layout
    :总而言之,项目根目录中直接有一个文件夹(以您希望用户使用的“导入名称”命名),该文件夹本身将在运行期间复制到
    site-packages
    安装。

请注意,在这两种情况下,源代码中的部分目录结构都是在内部模仿的

site-packages

在您的示例中,您似乎想要挑选源代码的不同部分,并将它们重新组装到

site-packages
内的不同目录结构中(源代码中没有相同的对应部分)。这是一个不简单的自定义,需要进行额外的配置:

  1. 您需要显式设置

    tool.setuptools.packages
    ,因为自动发现无法处理自定义项目布局。可能是这样的(未经测试,可能需要调整):

    [tool.setuptools]
    packages = ["myproj", "myproj.algorithms", "myproj.configs", ...]
    

    您需要编写all嵌套包。另请注意,Python 所有文件夹都被视为包并且可以导入。即使它们不包含

    __init__.py

  2. 您需要设置

    tool.setuptools.package-dir
    以将文件“重新映射”/“重新组装”到自定义结构中。可能是这样的(未经测试,可能需要调整):

    [tool.setuptools.package-dir]
    myproj = "src/myproj"
    myproj.algorithms = "algorithms"
    myproj.configs = "configs"
    
  3. (可选)如果你想避免写

    MANIFEST.in
    ,你也可以添加
    tool.setuptools.package-data
    (未经测试,可能需要调整):

    [tool.setuptools.package-data]
    "" = ["*.yml", ...]
    

    这里

    ""
    (空字符串`是一个特殊值,表示“任何包”)。

这可能非常乏味(并且每次创建新文件夹时都需要更改

pyproject.toml
)。这就是为什么大多数人倾向于“约定优于配置”,并以与普通
src-layout
flat-layout
相匹配的方式重新构建项目文件夹。

© www.soinside.com 2019 - 2024. All rights reserved.