Python setuptools/pip将数据文件打包到包中

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包中) 我已经尝试将它添加

我有这样一个git回购结构:

.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
,但是——再说一遍——不管怎样。。。它起作用了。