4

我想打包一个包含(并使用)模板 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目录没有被提取吗?

4

1 回答 1

3

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

更换后

html_path = resource_filename(__name__, "html")

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

一切正常。

于 2014-03-13T16:53:19.940 回答