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.py
、html/index.html
、print_filename.py
文件(例如,gist)重现您的问题?
【参考方案1】:
找到问题的原因。正如@erykson 指出的那样,我使用了错误的目录。
替换后
html_path = resource_filename(__name__, "html")
与
html_path = resource_filename(Requirement.parse("myproj"), "html")
一切正常。
【讨论】:
这是否意味着resource_filename("myproj", "html")
在您的情况下失败了?
如果您不想指定myproj
,resource_filename(Requirement.parse(__name__), 'html')
也可以使用以上是关于pkg_resources.resource_filename 没有提取文件的主要内容,如果未能解决你的问题,请参考以下文章