Python setuptools/pip 将数据文件打包到您的包中
Python setuptools/pip packing data files into your package
我有这个 git 回购结构:
.gitignore
JSONs/subdirA/some.json
JSONs/subdirB/other.json
MyPackage/__init__.py
MyPackage/myModule.py
如何正确地将 JSONs
文件夹打包到 MyPackage/JSONs
,而不是将其永久移动到那里(主要是因为客户直接将此 git 存储库用于非 python用法,repo 顶部的文件夹是 easy/intuitive... 但现在我也想将这个相同的目录发布到我的 PyPi 包中)?
我试过将它添加到 MANIFEST.in
,然后在 setup.py
和 package_data
中玩 data_files
... 但无济于事。也许一些 .pyc 或缓存的构建文件得到了我最好的......但我还没有从所有其他(不完全)重复的问题中弄清楚,因为他们没有明确指出他们的目录结构和所需的最终位置。
我尝试在调用 setup
之前求助于 os.walk
和 shutil.copy
,然后在 setup
之后删除该目录...虽然它似乎有效在本地,当推送到我们本地的 devpi 包服务器时,出现了问题。我的目标完全不符合 setuptools/pip 理想吗???或者我只是缺少一些关键的理解?请赐教!
类似以下内容可能会有所帮助:
首先我们需要确保 json 文件已添加到 源代码分发.
MANIFEST.in
:
recursive-include JSONs *.json
然后在实际的 setup 脚本中,必须即时修改 packages 列表以考虑目标包结构。
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"}
我有这个 git 回购结构:
.gitignore
JSONs/subdirA/some.json
JSONs/subdirB/other.json
MyPackage/__init__.py
MyPackage/myModule.py
如何正确地将 JSONs
文件夹打包到 MyPackage/JSONs
,而不是将其永久移动到那里(主要是因为客户直接将此 git 存储库用于非 python用法,repo 顶部的文件夹是 easy/intuitive... 但现在我也想将这个相同的目录发布到我的 PyPi 包中)?
我试过将它添加到 MANIFEST.in
,然后在 setup.py
和 package_data
中玩 data_files
... 但无济于事。也许一些 .pyc 或缓存的构建文件得到了我最好的......但我还没有从所有其他(不完全)重复的问题中弄清楚,因为他们没有明确指出他们的目录结构和所需的最终位置。
我尝试在调用 setup
之前求助于 os.walk
和 shutil.copy
,然后在 setup
之后删除该目录...虽然它似乎有效在本地,当推送到我们本地的 devpi 包服务器时,出现了问题。我的目标完全不符合 setuptools/pip 理想吗???或者我只是缺少一些关键的理解?请赐教!
类似以下内容可能会有所帮助:
首先我们需要确保 json 文件已添加到 源代码分发.
MANIFEST.in
:
recursive-include JSONs *.json
然后在实际的 setup 脚本中,必须即时修改 packages 列表以考虑目标包结构。
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"}