我有这个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
和setup.py
中同时使用package_data
...但无济于事。也许有些.pyc或缓存的构建文件最适合我...但是我还没有从所有其他(不太完全)重复的问题中弄清楚它们,因为它们没有专门指出其目录结构和所需的最终位置。
我尝试在调用os.walk
之前先使用shutil.copy
和setup
,然后在setup
之后删除该目录...虽然它似乎可以在本地运行,当推送到我们本地的devpi软件包服务器时,出现了问题。我的目标是否完全脱离了setuptools / pip理想???还是我只是缺少一些关键的了解?请赐教!
答案 0 :(得分:4)
类似以下内容可能会有所帮助:
首先,我们需要确保将 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"}