从蛋内部访问python egg中的文件

Eug*_*ine 10 python pkg-resources

问题是试图获得如何做到这一点的确切指示.之前几乎没有尝试,似乎不是完整的解决方案:

解决方案来移动包内的文件

读取为zip的解决方案

通过get_distribution访问元信息

手头的任务是阅读有关程序运行的蛋的信息.我理解的方法很少:

  1. 硬编码鸡蛋的位置并将其视为zip存档 - 将起作用,但不够灵活,因为如果将文件移动到另一个位置,则需要对其进行编辑和重新编译

  2. 使用ResourceManager().resource_filename(__name__, filename)- 这似乎是有限的,因为我无法访问鸡蛋内部的文件,但不能访问包内.文件名中的"../../EGG-INFO/PKG-INFO"等符号不起作用,给出KeyError.所以也没有好处.

  3. 使用dist = pkg_resources.get_distribution("dist_name")然后使用dist对象来获取信息,但我无法从文档中了解如何指定我的分发名称?它找不到它.

因此,我正在寻找关于使用pkg_resources.get_distributionplus的正确解决方案,最终有一个完整的解决方案来读取鸡蛋内部的任何文件会很高兴.

谢谢!

Ala*_*oni 8

Setuptools/distribute/pkg_resources旨在成为标准Python distutils的一种透明覆盖,这种覆盖非常有限,并且不允许分发代码的好方法.

鸡蛋只是将一堆python文件,数据文件和元数据放在一起的一种方式,有点类似于Java JAR - 但是python包可以从源代码安装,即使没有en egg(这是标准中不存在的概念)分配).

所以这里有两个场景:要么你是一个试图在库中使用某个文件的程序员,在这种情况下,为了从你的发行版中读取任何文件,你不需要它的完整路径 - 你只需要一个打开文件对象及其内容,对吗?所以你应该做这样的事情:

from pkg_resources import resource_stream, Requirement
resource_stream(Requirement.parse("restez==0.3.2"), "restez/httpconn.py")
Run Code Online (Sandbox Code Playgroud)

这将返回您从程序包分发中请求的文件的打开的可读文件.如果它是一个拉链蛋,它将被自动提取.

请注意,您应该在(restez)中指定包名称,因为分发名称可能与包不同(例如,分发Twisted然后使用扭曲的包名称).需求解析使用以下语法:http://setuptools.readthedocs.io/en/latest/pkg_resources.html#requirements-parsing

这应该足够了 - 一旦你知道如何从蛋内部获取文件,你就不需要知道蛋的路径.

如果您真的想要完整路径并且确定您的egg未压缩,请使用resource_filename而不是resource_stream.

否则,如果你正在构建一个"包装工具"并且需要访问包的内容,无论是鸡蛋还是其他任何东西,你都必须自己手动完成,就像pkg_resources那样(pkg_resources source)."查询鸡蛋内容"没有精确的API,因为没有用例.如果你是一个只使用库的程序员,请像我建议的那样使用pkg_resources.如果你正在构建一个包装工具,你应该知道把手放在哪里,就是这样.