首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何从src子目录外部添加package_data以便实际安装?

如何从src子目录外部添加package_data以便实际安装?
EN

Stack Overflow用户
提问于 2021-09-20 06:27:24
回答 2查看 424关注 0票数 0

我知道已有类似的问题,但答案对我的情况并无帮助。我相信,从那时起,随着.whl文件的引入和默认设置,情况发生了变化。

pip 21.2.4

python 3.9.5

情况就是这样。我有一个python项目,我正在为它生成发布的包。该项目将不会上传到公共存储库,因为它是一个用于控制我工作地点的自定义设备的库。

在发布的包中,我希望不仅包括.py文件,而且还包括其他文件,如配置文件模板、使用示例和其他文档。等。

让我们把重点放在模板上,因为rest是类似的。

我当前的项目结构(名称更改):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
deviceFFS
+-dist
| \-generated release packages...
+-src
| \-deviceffs
|   +-__init__.py
|   \-other .py files...
+-template
| +-template_A.ini
| \-template_B.ini
+-tests
| \-some tests...
+-venv
| \-...
+-LICENSE
+-MANIFEST.in
+-pyproject.toml
+-README.md
+-requirements.txt
+-setup.cfg
\-setup.py

和配置文件的内容,然后再尝试添加其他文件:

setup.cfg:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[metadata]
name = deviceffs
version = 0.1.2
author = B
author_email = B
description = device for my job

[options]
python_requires= >=3.9
install_requires=
        configparser
        pyserial
package_dir=
        =src
packages=find:

[options.packages.find]
where=src

setup.py:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from setuptools import setup

setup()

pyproject.toml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[build-system]
requires = [
        "setuptools",
        "wheel"
]
build-backend = "setuptools.build_meta"

好的,现在我要添加模板文件:

模板/模板_A.

模板/模板_B.ini

第一步:

我编辑了MANIFEST.in:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
include template/*

并添加到setup.cfg中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
include_package_data=true

完成此操作后,生成的(python -m build) .tar.gz文件确实包含“模板”子目录。不知道.hwl文件,因为我不知道如何预览这些文件。但是,如果我使用python -m pip install -vvv在自定义项目中安装这个包(使用venv),那么无论我是从.tar.gz还是从.whl安装,都不会在任何地方安装这些文件。我使用-vvv查看由pip执行的每个文件复制操作,以查看它是否已安装。

第二步:

使用MANIFEST.in代替package_data。我从以前的aproach中恢复更改,而是编辑setup.py:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setup(package_data={"deviceffs": ["template/*"]})

不幸的是,这样我就可以从'.\src\deviceffs\template‘而不是'.\template’中获得文件,因为路径是相对于。

我不想将模板(以及将来的使用示例,其他描述)放到.\src中,也不想将它们单独分发到包中。

第三章:

用“package_data”代替“data_files”

这似乎是过去行之有效的解决办法。然而,现在pip默认使用.whl (即使是从.tar.gz安装),这似乎完全忽略了'data_files‘。

最后:

我没有主意了。

我今天大部分时间都在努力使生成的版本包含我的文件,而不是实际处理文件的实际内容。

来自互联网的信息是相互矛盾的。

我正在寻找如何正确配置这个的建议。

提前谢谢。

编辑以添加python和pip版本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-21 09:44:40

看来您需要使用package_dir。我不太确定最终的软件包树结构,你的目标,所以我将猜测一点。

如果我假设您希望在包deviceffs.template中拥有模板文件,那么显然setuptools find_packages函数无法找到deviceffs.templates包,因为没有src/devicesffs/template目录。因此,我们不能完全依赖find_packages,而需要动态地修改setup.py中的packages列表。

从我的头顶上,没有测试

setup.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python"
import setuptools
setuptools.setup(
    packages=setuptools.find_packages() + ['deviceffs.template'],
    package_dir={
        'deviceffs': 'src/deviceffs',
        'deviceffs.template': 'template',
    },
    # The rest is in 'setup.cfg'
)

差不多吧。您还可能需要添加一个template/__init__.py文件。

票数 1
EN

Stack Overflow用户

发布于 2021-09-20 07:06:42

recursive-include template/ *.ini添加到MANIFEST.in为我工作

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

https://stackoverflow.com/questions/69256134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文