pkg_resources.resource_filename 没有提取文件

Posted

技术标签:

【中文标题】pkg_resources.resource_filename 没有提取文件【英文标题】:pkg_resources.resource_filename is not extracting files 【发布时间】:2014-04-18 08:04:12 【问题描述】:

我想打包一个包含(并使用)模板 html 文件的项目并将其作为鸡蛋分发。由于我使用的是 tornadoweb,它需要文件路径指向 html 文件,所以我无法通过流访问资源,我确实需要在程序运行时提取 html 文件。

我正在查看 setuptools 并根据 resource_filename 文档(粗体是我的):

有时,仅以字符串或流形式访问资源是不够的,需要真正的文件系统文件名。在这种情况下,您可以使用此方法(或模块级函数)来获取资源的文件名。 如果资源在存档分发中(例如压缩的鸡蛋),它将被提取到缓存目录,并返回缓存中的文件名。如果命名资源是一个目录,那么该目录中的所有资源(包括子目录)也会被提取。如果命名资源是 C 扩展或“eager 资源”(有关详细信息,请参阅 setuptools 文档),则同时提取所有 C 扩展和 Eager 资源。

这似乎正是我所需要的。然而,这不是我的机器上发生的事情。我的setup.py 包含以下行:

data_files = [('html', ['html/index.html'])]

index.html 实际上包含在我的egg 文件中。当我运行python3 setup.py install 时,我的项目将安装为单个压缩的 egg 文件。不幸的是,当我的程序执行以下行时:

html_path = resource_filename(__name__, "html")

我得到以下返回值:

/usr/local/lib/python3.2/dist-packages/myproj-0.1-py3.2.egg/EGG-INFO/scripts/html/

问题在于 myproj-0.1-py3.2.egg 实际上是一个 zip 文件,所以这不是一个有效的路径。

这很奇怪,因为如果我调用 pkg_resources.get_cache_path(‘myproj’) 我会得到以下路径:

/root/.python-eggs/myproj-tmp

但是那里没有提取任何东西(是的,我正在以 root 身份运行程序,但我只是在测试它)。

知道为什么我的html 目录没有被解压吗?

【问题讨论】:

您能否提供一个最小示例:setup.pyhtml/index.htmlprint_filename.py 文件(例如,gist)重现您的问题? 【参考方案1】:

找到问题的原因。正如@erykson 指出的那样,我使用了错误的目录。

替换后

html_path = resource_filename(__name__, "html")

html_path = resource_filename(Requirement.parse("myproj"), "html")

一切正常。

【讨论】:

这是否意味着resource_filename("myproj", "html") 在您的情况下失败了? 如果您不想指定myprojresource_filename(Requirement.parse(__name__), 'html') 也可以使用

以上是关于pkg_resources.resource_filename 没有提取文件的主要内容,如果未能解决你的问题,请参考以下文章