在 Python 包中查找数据文件 - setup.py 的 package_data=... 可能已损坏?

Posted

技术标签:

【中文标题】在 Python 包中查找数据文件 - setup.py 的 package_data=... 可能已损坏?【英文标题】:find data files inside a Python package - setup.py's package_data=... maybe broken?在 Python 包中查找数据文件 - setup.py 的 package_data=... 可能已损坏? 【发布时间】:2021-09-26 14:38:03 【问题描述】:

我有同样的情况,比如here、here、here 和here。我遵循了这些问题中给出的建议,但仍然收到 FileNotFoundError。

--树--

.
MANIFEST.in
setup.py
...
--src
   |--__init__.py
   |--mypkg
        |--__init__.py
        |--module_1.py  # dosth_1() in module_1  needs somedata.json
        ...
   |--data
        |--__init__.py
        |--somedata.json
        |--someotherdata.txt
        ...

--setup.py--

packages=["mypkg"],
package_dir="": "src",
package_data="mypkg": ["data/*.txt", "data/*.json"],

--删除旧版本后--

(venv)$ python3 -m build
...
copying src/mypkg/somedata.json -> .../src/mypkg/data
...
adding 'mypkg/data/somedata.json'
...

--下一个--

将 mypkg 上传到 PyPI pip install mypkg(在不同的 vEnv 中)

--打开python解释器--

>>from mypkg import module_1
>>res = module_1.dosth_1()

--抛出错误--

... 文件“/usr/lib/python3.8/importlib/resources.py”,第 82 行,在 _check_location raise FileNotFoundError(f'Package has no location package!r') FileNotFoundError: Package has no location

所以我真的很困惑为什么会发生这种情况。我处理了 init.py,按照宣传的方式完成了 setup.py,如果我正确理解了构建 cmets,则将数据文件添加到构建中。安装的软件包仍然无法访问数据。这里有什么问题?

【问题讨论】:

数据文件真的是用pip安装的吗?即,他们在site-packages/mypkg/data中吗? @MattDMo 是的,我可以看到所有这些。 【参考方案1】:

通过更改 setup.py 来解决它:

packages=["mypkg"],
package_dir="": "src",
package_data="mypkg": ["data/*.txt", "data/*.json"],

到:

packages=["mypkg"],
include_package_data=True,
package_dir="": "src",

对我来说,这似乎很模糊。这实际上让我想知道 package_data=... 是否可能损坏了。

【讨论】:

以上是关于在 Python 包中查找数据文件 - setup.py 的 package_data=... 可能已损坏?的主要内容,如果未能解决你的问题,请参考以下文章

纯Python包发布setup脚本编写示例

尝试在 Python 包中读取 JSON 文件

python 读取位于包中的数据文件

将数据文件添加到 python 项目 setup.py

RobotFramework + Python 自动化入门 五 (Suite Setup/Teardown+Resource文件+Locator和数据封装)

模块作为Python中没有.py的脚本?