Python setuptools/pip将数据文件打包到包中
我有这样一个git回购结构:Python setuptools/pip将数据文件打包到包中,python,pip,setuptools,Python,Pip,Setuptools,我有这样一个git回购结构: .gitignore JSONs/subdirA/some.json JSONs/subdirB/other.json MyPackage/__init__.py MyPackage/myModule.py 我如何正确地将JSONs文件夹打包到MyPackage/JSONs中,而不将其永久移动到那里(主要是因为客户直接将此git repo用于非python用途,并且repo顶部的文件夹很简单/直观……但现在我还想将此目录发布到我的PyPi包中) 我已经尝试将它添加
.gitignore
JSONs/subdirA/some.json
JSONs/subdirB/other.json
MyPackage/__init__.py
MyPackage/myModule.py
我如何正确地将JSONs
文件夹打包到MyPackage/JSONs
中,而不将其永久移动到那里(主要是因为客户直接将此git repo用于非python用途,并且repo顶部的文件夹很简单/直观……但现在我还想将此目录发布到我的PyPi包中)
我已经尝试将它添加到清单.in
中,然后在setup.py
中玩data\u文件
,以及package\u数据
。。。但是没有用。也许一些.pyc或缓存的构建文件占了我的上风。。。但我还没有从所有其他(不完全)重复的问题中找到答案,因为它们没有明确指出它们的目录结构和所需的最终位置
我尝试在调用
setup
之前使用os.walk
和shutil.copy
,然后在setup
之后删除该目录。。。虽然它似乎在本地工作,但在推送到本地devpi包服务器时,出现了一些问题。对于setuptools/pip ideals,我的目标是否完全不受关注???还是我只是缺少一些关键的理解?请开导我 类似以下内容可能会有所帮助:
首先,我们需要确保将json文件添加到源发行版中
清单。在
中:
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',
)
import pkgutil
print(pkgutil.get_data('MyPackage', 'JSONs/subdirA/some.json').decode())
JSONs/subdirA/some.json
:
{"Marco": "Polo"}
这样的包数据可以这样读取:
MyPackage/myModule.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',
)
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"}
类似以下内容可能会有所帮助: 首先,我们需要确保将json文件添加到源发行版中
清单。在
中:
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',
)
import pkgutil
print(pkgutil.get_data('MyPackage', 'JSONs/subdirA/some.json').decode())
JSONs/subdirA/some.json
:
{"Marco": "Polo"}
这样的包数据可以这样读取:
MyPackage/myModule.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',
)
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"}
为什么不简单地使用符号链接使它看起来像是
JSONs
目录在MyPackage
中?那么剩下的就相当标准了()。不要使用数据文件
,使用清单。在
和包数据
中,符号链接可以提交到GIT吗?以跨平台的方式(python包主要在Windows上工作,但使用JSONs的C代码在linux上工作)我想它是这样的。但除此之外,您可以使用setuptools的package\u dir
重写到JSONs
目录的路径。类似于package\u dir={'MyPackage.JSONs':'JSONs'}
,假设您的setup.py
与.gitignore
(根目录)位于同一目录中谢谢,我现在就试试package\u dir
。关于您之前链接的页面,令人困惑的是,数据文件已经在包中了,而在我的例子中,它们不是。因此,我之前的尝试是将JSONs
文件夹留在sys.prefix
或site packages
中,具体取决于我的尝试。是的,这就是package\u dir
的全部要点,它将/JSONs
转换为MyPackage/JSONs
,当它进行构建时,也就是说,在控制盘中它有新的路径,但在sdist中它仍然有旧的结构。为什么不简单地使用符号链接使它看起来像JSONs
目录在MyPackage
中?那么剩下的就相当标准了()。不要使用数据文件
,使用清单。在
和包数据
中,符号链接可以提交到GIT吗?以跨平台的方式(python包主要在Windows上工作,但使用JSONs的C代码在linux上工作)我想它是这样的。但除此之外,您可以使用setuptools的package\u dir
重写到JSONs
目录的路径。类似于package\u dir={'MyPackage.JSONs':'JSONs'}
,假设您的setup.py
与.gitignore
(根目录)位于同一目录中谢谢,我现在就试试package\u dir
。关于您之前链接的页面,令人困惑的是,数据文件已经在包中了,而在我的例子中,它们不是。因此,我之前的尝试是将JSONs
文件夹留在sys.prefix
或site packages
中,具体取决于我的尝试。是的,这就是package\u dir
的全部要点,它将/JSONs
转换为MyPackage/JSONs
,当它进行构建时,也就是说,在方向盘中它有新的路径,但在sdist中它仍然有旧的结构。非常感谢!这很有效,没有添加任何\uuuu init\uuuu.py
文件,我很高兴它能帮助解决您的问题。事实上,我们不需要添加\uuuu init\uuuu.py
文件,这让我有点惊讶,但不管怎样。。。我真的不喜欢我们必须设置include\u package\u data=True
,但是——再说一遍——不管怎样。。。很有效,非常感谢!这很有效,没有添加任何\uuuu init\uuuu.py
文件,我很高兴它能帮助解决您的问题。事实上,我们不需要添加\uuuu init\uuuu.py
文件,这让我有点惊讶,但不管怎样。。。我真的不喜欢我们必须设置include\u package\u data=True
,但是——再说一遍——不管怎样。。。它起作用了。