python - Python setuptools/pip 将数据文件打包到你的包中
问题描述
我有这个 git repo 结构:
.gitignore
JSONs/subdirA/some.json
JSONs/subdirB/other.json
MyPackage/__init__.py
MyPackage/myModule.py
如何正确地将JSONs
文件夹打包到MyPackage/JSONs
中,而不是将其永久移动到那里(主要是因为客户直接将此 git repo 用于非 python 用途,并且 repo 顶部的文件夹很简单/直观......但现在我也想要将相同的目录发布到我的 PyPi 包中)?
我已经尝试将它添加到MANIFEST.in
然后玩data_files
insetup.py
以及package_data
...但无济于事。也许一些 .pyc 或缓存的构建文件对我来说是最好的......但我还没有从所有其他(不完全)重复的问题中弄清楚它,因为它们没有专门调用它们的目录结构和所需的最终位置。
我已经尝试在调用之前os.walk
和之后删除该目录......虽然它似乎在本地工作,但当推送到我们的本地 devpi 包服务器时,出现了问题。我的目标完全脱离了 setuptools/pip 理想的雷达吗???还是我只是缺少一些关键的理解?请赐教!shutil.copy
setup
setup
解决方案
类似以下内容可能会有所帮助:
首先,我们需要确保将json文件添加到源代码分发中。
MANIFEST.in
:
recursive-include JSONs *.json
然后在实际的设置脚本中,必须动态修改包列表以考虑目标包结构。
setup.py
:
#!/usr/bin/env python3
import setuptools
PACKAGES = (
setuptools.find_packages(exclude=['JSONs*'])
+
[
f'MyPackage.{package}'
for package
in setuptools.find_namespace_packages(include=['JSONs*'])
]
)
setuptools.setup(
packages=PACKAGES,
package_dir={
'MyPackage.JSONs': 'JSONs',
},
include_package_data=True,
#
name='Something',
version='1.2.3',
)
JSONs/subdirA/some.json
:
{"Marco": "Polo"}
这样的包数据可以这样读取:
MyPackage/myModule.py
:
import pkgutil
print(pkgutil.get_data('MyPackage', 'JSONs/subdirA/some.json').decode())
并像下面这样使用它:
$ python -m pip install .
$ # Move to another directory to prevent that the current working directory
$ # ... overshadows the installed project
$ cd ..
$ python -m MyPackage.myModule
{"Marco": "Polo"}
推荐阅读
- c - 使用指针按字母顺序对字符串数组进行排序
- c# - 无法将类型“System.DateTime”隐式转换为 IEnumerable
- vim - 使用 vimscript 通过使用普通 vim 命令运行测试脚本
- python - 查找给定字符串中使用的字符的最大频率
- reactjs - Stripe + NextJs - 未定义窗口
- python - 如何在 pygame 中以正确的方式使用 blit()?
- flutter - Flutter 更新到 1.15.22-pre.18 后将无法在 iOS 上运行。Xcode 构建失败
- python-unittest - 自定义 GNU radio python 块中引发的异常的单元测试
- image - 图像处理如何检测图像中的特定自定义形状
- python - 在没有 ssh 进入我的容器的情况下运行测试