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

jon*_*sfj 11 python distutils setuptools

我正在做一个独立于平台的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 ...等...如何在开发过程中找到数据文件?并在任意平台上安装后?

jfs*_*jfs 7

你可以尝试pkg_resources:

my_data = pkg_resources.resource_string(__name__, fname)
Run Code Online (Sandbox Code Playgroud)


Seb*_*ack 6

您应该使用pkgutil/pkg_resources模块来加载数据文件.它甚至可以在ziped鸡蛋中使用.


Ned*_*der 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)
Run Code Online (Sandbox Code Playgroud)

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

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