【问题标题】:Is it possible to embed a .xml file into a conda package?是否可以将 .xml 文件嵌入到 conda 包中?
【发布时间】:2020-07-22 14:44:37
【问题描述】:

我正在为 Python 开发一个 conda 包。 代码的某些行为取决于存储在 .xml 文件中的信息。

我不希望我的包依赖于应该与包一起分发的外部文件,并且必须由它找到。

有没有办法在我构建时将此 .xml 文件嵌入到 conda 包中?

谢谢!

【问题讨论】:

  • 是的,你可以使用build.sh or bld.bat scripts将任意文件添加到conda包中。
  • 谢谢!我继续您共享的链接,但我仍然无法弄清楚如何将其他文件包含到包中。查看示例 (github.com/AnacondaRecipes/conda-feedstock/tree/master/recipe) 也无济于事。您能分享一个工作示例吗?
  • 对不起,我没有花足够的时间来理解用例。我发布了一种无需特殊处理 conda 包装即可解决您的问题的方法。这种方法直接使用 setuptools 安装和定位数据。

标签: python package conda


【解决方案1】:

如果您正在开发 python 包,解决此问题的直接方法是直接使用 setuptools 来传送额外数据:

一个简单的示例项目可能如下所示

example_project
├── Manifest.in
├── data
│   └── data.xml
├── setup.py
└── test_me
    └── __init__.py

各个部分:

data/data.xml(您希望随包裹一起提供的数据):

<data>
    <message>Hello World!</message>
</data>

test_me/__init__.py(读取包中数据的示例):

from pkg_resources import Requirement, resource_filename
import xml.etree.ElementTree as ET
xml_file = resource_filename(Requirement.parse("MyPythonPackageName"), "data/data.xml")

etree = ET.parse(xml_file)
message = etree.getroot()[0].text

Manifest.in(确保在构建分布时包含数据):

include data/data.xml

setup.py(一个最小的设置脚本;注意我们明确设置了include_package_data):

from setuptools import setup, find_packages

setup(
    name='MyPythonPackageName',
    version='1.0.0',
    author='Me',
    author_email='author@me.com',
    description='additional resource example',
    packages=find_packages(),
    include_package_data=True
)

要对其进行测试,您可以通过pip install . 从顶级目录安装它,然后使用python -c "import test_me; print(test_me.message)" 在xml 中打印消息

conda 包只是安装 python 包,应该不需要额外的步骤。

【讨论】:

  • 这正是我一直在寻找的,我认为这对我有用,谢谢!
  • 我不明白这条线是如何工作的:resource_filename(Requirement.parse("TestMe"), "data/data.xml") 它知道'TestMe'确实是目录test_me吗?
  • 好吧,我理解我的误会了,TestMe是包名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2013-07-06
  • 1970-01-01
  • 2012-08-15
  • 2011-09-05
  • 2012-10-25
相关资源
最近更新 更多