首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在setup.py中安装期间动态复制软件包数据

在setup.py中安装期间动态复制软件包数据
EN

Stack Overflow用户
提问于 2020-01-22 16:26:08
回答 1查看 179关注 0票数 0

我有一个目录结构,如下所示:

代码语言:javascript
复制
.
├── bitbucket-pipelines.yml
├── MANIFEST.in
├── pylintrc
├── setup.cfg
├── setup.py
├── src
│   ├── bin
│   │   ├── __init__.py
│   │   └── project.py
│   ├── __init__.py
│   └── ml_project
│       ├── configurations
│       │   └── precommit
│       ├── core
│       │   ├── command
│       │   │   ├── abs_command.py
│       │   │   ├── __init__.py
│       │   │   ├── no_command.py
│       │   │   ├── precommit.py
│       │   │   ├── project_utils.py
│       │   │   ├── setupsrc.py
│       │   │   └── setuptox.py
│       │   ├── configurations
│       │   │   └── precommit
│       │   └── __init__.py
│       └── __init__.py
└── tox.ini

在对项目进行打包时,我的要求基本上是将文件.gitlint.pre-commit-config.yaml文件复制到ml_project包的configurations/precommit文件夹中。Python只是一个普通的目录,并不是一个configurations包,因为它不包含.py文件。

小编辑:.gitlint.pre-commit-config.yamlsetup.py处于同一级别。

我的setup.py如下所示:

代码语言:javascript
复制
"""Setup script."""

import io
import re
import os
import shutil
from setuptools import setup

PROJECT_NAME = "ml_project"
CONFIGURATIONS_DIR_NAME = "configurations"
FULL_CONFIG_DIR = os.path.join("src", PROJECT_NAME, CONFIGURATIONS_DIR_NAME)


def get_version() -> str:
    """Return the version stored in `ml_project/__init__.py:__version__`."""
    # see https://github.com/pallets/flask/blob/master/setup.py
    with io.open("src/ml_project/__init__.py", "rt", encoding="utf8") as init_file:
        return re.search(r'__version__ = "(.*?)"', init_file.read()).group(1)


def add_config_files_for_package(source_dir: str = None) -> None:
    if not source_dir:
        source_dir = os.path.dirname(os.path.abspath(__file__))
    config_files = {"precommit": [".gitlint", ".pre-commit-config.yaml"]}
    for config in config_files:
        config_dir = os.path.join(source_dir, FULL_CONFIG_DIR, config)
        for file in config_files[config]:
            shutil.copyfile(
                os.path.join(source_dir, file), os.path.join(config_dir, file)
            )


add_config_files_for_package()
setup(version=get_version())

因此,在运行python setup.py sdist时,我使用add_config_files_for_package函数进行复制。

我有一个MANIFEST.in文件,如下所示:

代码语言:javascript
复制
include .gitlint
include .pre-commit-config.yaml
graft src/ml_project

最后,下面是我的setup.cfg

代码语言:javascript
复制
[options]
package_dir =
    =src
packages = find:
include_package_data = true
install_requires =
    click
    pre-commit
    pyyaml
    gitlint


[options.packages.find]
where = src

[options.entry_points]
console_scripts =
    project = bin.project:main

[options.extras_require]
tests =
    pytest
    pytest-mock
    pyfakefs
    pyyaml
    configparser
linting =
    pylint
testdocs =
    pydocstyle
pre-commit =
    pre-commit

[semantic_release]

version_variable = ml_project/__init__.py:__version__

这运行得很好,但我的问题是:有没有更好、更标准的方法来做这件事?就像根本不写函数?

感谢您提前给我指点。

EN

回答 1

Stack Overflow用户

发布于 2020-01-24 01:23:17

正如注释中所提到的,最好将这些文件放在src/ml_project/configurations/precommit目录中,并在项目的根目录下创建指向这些文件的符号链接。符号链接应该可以在git上运行得很好,但是有些平台(比如Windows)对符号链接的支持不是很好。

或者,这些文件的副本可能只是构建过程中的另一个步骤(最终通过自定义setuptools命令),应从Makefile (例如,或任何其他类似工具)和CI/CD工具链(在本例中为bitbucket-pipelines.yml)触发。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59855409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档