强制解包特定的egg目录
我有一个自己制作的PyQt应用程序的包,这个包里包含了用sphinx生成的文档。当我从应用程序中调用帮助文件时,它会在一个QtWebKit.QWebView窗口中打开sphinx的index.html文件。显然,只有index.html文件被提取到操作系统的egg目录中(比如在Windows下的[..]\Application Data\Python-Eggs\)。
这样就导致了样式表(css)、图片和链接都无法正常显示,因为其他文件似乎没有被解压出来;它们在egg文件里,但在egg目录中却找不到。
我是不是漏掉了什么?有没有办法强制立即解压所有的html、css和图片文件?
3 个回答
可能的原因是:一开始并没有把所有文件都包含在这个egg里。
你可以通过解压这个 .egg 文件来检查一下(在Windows上,你可能需要把它改名为 .zip 文件才能解压)。看看里面的内容是否都在。
看看你是怎么制作这个egg的。你有没有使用 MANIFEST.in 文件来告诉setuptools哪些文件要包含?如果没有,你可能是在依赖setuptools自动包含一些文件。所有的子版本文件会自动被包含进egg里,Python文件也是,其他的文件则不会。
Sphinx文档可能是生成的,所以它不在子版本里,因此不会自动包含。
有两种解决方案:
使用 MANIFEST.in 文件手动指定(通配符是可以用的)所有应该包含的文件。只要你列全了,这种方法是安全的。
或者把html文件指定为 package_data,具体可以参考 setuptools是如何决定保留哪些文件的?
def get_help_url(self):
from pkg_resources import resource_filename
from doc import sphinx
import os
from PyQt4.QtCore import QUrl
html_path = resource_filename(sphinx.__name__, os.path.join('build', 'html'))
return QUrl(os.path.join(html_path, 'index.html'))
而不是
html = resource_filename(sphinx.__name__, os.path.join('build', 'html', 'index.html'))
return QUrl(html)
解决了问题
我看到你已经找到其他方法来解决这个问题,但为了将来参考,这里有一种不需要绕弯子的自动处理方式,来自于文档:http://peak.telecommunity.com/DevCenter/setuptools#automatic-resource-extraction。
如果你使用的工具需要你的资源是“真实”的文件,或者你的项目包含一些没有扩展名的本地库或其他文件,而你的C扩展需要能够访问这些文件,那么你可能需要在setup()的eager_resources参数中列出这些文件,这样这些文件就会被一起提取。
所以,在这种情况下,你需要在:
eager_resources=['doc/sphinx/build/html', 'doc/sphinx/build/html/index.html']
你的setup.py文件中添加这段代码,这样当你请求index.html时,'html'目录就会被递归提取(假设你示例中的'doc'是一个顶级包)。
你可以在文档中找到更多关于eager_resources
关键字的信息,链接在这里:http://peak.telecommunity.com/DevCenter/setuptools#new-and-changed-setup-keywords。