11

我正在做一个独立于平台的 PyQt 应用程序。我打算使用 setuptools 编写 setup.py 文件。到目前为止,我已经设法解除平台技术,例如根据平台加载 setup() 的特定选项,以便在 Windows 上使用 py2exe ......等等......

但是,对于我的应用程序,我分发了一些主题、HTML 和图像,我需要在运行时将这些图像加载到应用程序中。到目前为止,它们都存储在应用程序的主题/目录中。

我一直在阅读有关 setuptools 和 distutils 的文档,并发现如果我为 setup() 提供了 data_files 选项以及要安装在“share/MyApp/themes/”中的主题/目录中的所有文件,它将被安装/usr/ 前缀,或平台上的任何 sys.prefix。我假设无论我在哪个平台上,我都会使用 os.path.join(sys.prefix, "share", "MyApp", "themes") 找到数据文件,对吧?

但是,我也希望能够在开发过程中访问数据文件,它们位于相对于应用程序源的主题/目录中。我该怎么做呢?是否有一些聪明的方法来确定应用程序是否已安装?或者是一个映射到数据文件的实用程序,无论它们现在在哪里?

我真的很讨厌添加各种丑陋的黑客来查看是否有与源相关的主题,或者在 sys.prefix/share... 等... 我如何在开发过程中找到数据文件?并在任意平台上安装后?

4

3 回答 3

7

你可以试试pkg_resources

my_data = pkg_resources.resource_string(__name__, fname)
于 2010-04-02T17:35:44.677 回答
6

我使用了一个名为 data_file 的实用程序方法:

def data_file(fname):
    """Return the path to a data file of ours."""
    return os.path.join(os.path.split(__file__)[0], fname)

我把它放在我项目的init .py 文件中,然后从我的包中的任何地方调用它以获取与包相关的文件。

Setuptools 提供了类似的功能,但这不需要 setuptools。

于 2009-08-02T17:58:14.727 回答
6

您应该使用 pkgutil/pkg_resources 模块来加载数据文件。它甚至可以在带拉链的鸡蛋中使用。

于 2010-09-13T17:27:02.323 回答