【问题标题】:Accessing data files before and after distutils/setuptools在 distutils/setuptools 之前和之后访问数据文件
【发布时间】:2010-11-16 04:53:00
【问题描述】:

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

【问题讨论】:

    标签: python setuptools distutils


    【解决方案1】:

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

    【讨论】:

    • 当 data_files 安装在 /usr/share/AppName/themes/ 并且我的可执行文件位于 /usr/lib/AppName 之类的东西时,这将如何工作我假设... DistUtils 文档说'将安装 sys.prefix 作为我给要存储的数据文件的相对路径的前缀...在 *nix 系统上,数据文件可能也应该在 /usr/share/AppName/
    • 我在 setup.py 中使用了 package_data 选项。不确定 data_files。
    • 好吧...是的,package_data 也是一个选项...也许我应该选择它...我只是不认为它会生成符合 Debian 的软件包 :)
    【解决方案2】:

    你可以试试pkg_resources:

    my_data = pkg_resources.resource_string(__name__, fname)
    

    【讨论】:

    • 我的数据文件安装在 xx.egg 根目录中,而资源字符串试图从 name 获取它们(女巫在 'xxx.egg/package/subpackage' 中)所以它总是失败。
    • @JensTimmerman:单击链接:“resource_name 参数相对于命名包进行解释”。所以如果你的文件安装到xxx的包目录下;使用 xxx 代替 __name__ 或配置将文件安装到子包的目录中。
    • 嗯,它们是安装在egg的根目录下的,所以默认的包目录,但是使用空字符串是行不通的。如果我必须将其配置为安装在源旁边,它似乎并没有让事情变得更容易......
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2022-08-15
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      相关资源
      最近更新 更多