强制解包特定的egg目录

5 投票
3 回答
2138 浏览
提问于 2025-04-15 16:10

我有一个自己制作的PyQt应用程序的包,这个包里包含了用sphinx生成的文档。当我从应用程序中调用帮助文件时,它会在一个QtWebKit.QWebView窗口中打开sphinx的index.html文件。显然,只有index.html文件被提取到操作系统的egg目录中(比如在Windows下的[..]\Application Data\Python-Eggs\)。

这样就导致了样式表(css)、图片和链接都无法正常显示,因为其他文件似乎没有被解压出来;它们在egg文件里,但在egg目录中却找不到。

我是不是漏掉了什么?有没有办法强制立即解压所有的html、css和图片文件?

3 个回答

1

可能的原因是:一开始并没有把所有文件都包含在这个egg里。

  • 你可以通过解压这个 .egg 文件来检查一下(在Windows上,你可能需要把它改名为 .zip 文件才能解压)。看看里面的内容是否都在。

  • 看看你是怎么制作这个egg的。你有没有使用 MANIFEST.in 文件来告诉setuptools哪些文件要包含?如果没有,你可能是在依赖setuptools自动包含一些文件。所有的子版本文件会自动被包含进egg里,Python文件也是,其他的文件则不会。

  • Sphinx文档可能是生成的,所以它不在子版本里,因此不会自动包含。

有两种解决方案:

  • 使用 MANIFEST.in 文件手动指定(通配符是可以用的)所有应该包含的文件。只要你列全了,这种方法是安全的。

  • 或者把html文件指定为 package_data,具体可以参考 setuptools是如何决定保留哪些文件的?

2
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)

解决了问题

4

我看到你已经找到其他方法来解决这个问题,但为了将来参考,这里有一种不需要绕弯子的自动处理方式,来自于文档: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

撰写回答