在distutils/setuptools前后访问数据文件

11 投票
3 回答
3628 浏览
提问于 2025-04-15 13:20

我正在做一个可以在不同平台上运行的PyQt应用程序。我打算使用setuptools来写一个setup.py文件。到目前为止,我已经能够检测到平台,比如根据不同的平台加载setup()的特定选项,以便在Windows上使用py2exe等等。

不过,我的应用程序还需要分发一些主题、HTML和图片,我需要在运行时加载这些图片。目前它们都存放在应用程序的themes/目录下。

我一直在阅读setuptools和distutils的文档,发现如果我在setup()中使用data_files选项,把themes/目录下的所有文件安装到"share/MyApp/themes/",那么它会带上一个/usr/前缀,或者根据平台的sys.prefix来决定。我想我可以用os.path.join(sys.prefix, "share", "MyApp", "themes")来找到这些数据文件,不管我在哪个平台上,对吧?

但是,我也想在开发过程中访问这些数据文件,它们相对于应用程序源代码仍然在themes/目录下。我该怎么做呢?有没有什么聪明的方法可以判断应用程序是否已经安装?或者有没有工具可以不管文件在哪里都能映射到这些数据文件呢?

我真的不想添加各种奇怪的黑科技来判断主题文件是相对于源代码的,还是在sys.prefix/share下等等。我该如何在开发过程中找到这些数据文件?在任意平台上安装后又该如何找到呢?

3 个回答

6

你应该使用 pkgutil/pkg_resources 模块来加载数据文件。这个方法甚至可以在压缩的 egg 文件中使用。

7

你可以试试 pkg_resources 这个工具:

my_data = pkg_resources.resource_string(__name__, fname)
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。

撰写回答