访问distutils / setuptools之前和之后的数据文件

时间:2009-08-02 17:42:46

标签: python setuptools distutils

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

然而,在我的应用程序中,我正在分发一些主题,HTML和图像,我需要在运行时在应用程序中加载这些图像。到目前为止,它们存储在应用程序的themes /目录中。

我一直在阅读有关setuptools和distutils的文档,并想出如果我给了setup()data_files选项以及要在“share / MyApp / themes /”中安装的themes /目录中的所有文件,它会安装时带有/ usr /前缀,或平台上的任何sys.prefix。 我假设我会找到使用os.path.join(sys.prefix,“share”,“MyApp”,“themes”)的数据文件,这对我所在的平台来说是对的,对吗?

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

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

3 个答案:

答案 0 :(得分:7)

您可以尝试pkg_resources

my_data = pkg_resources.resource_string(__name__, fname)

答案 1 :(得分:6)

你应该use the pkgutil/pkg_resources module to load the data files。它甚至可以在ziped鸡蛋中使用。

答案 2 :(得分:5)

我使用了一个名为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。