Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在distutils/setuptools前后访问数据文件_Python_Setuptools_Distutils - Fatal编程技术网

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

Python 在distutils/setuptools前后访问数据文件,python,setuptools,distutils,Python,Setuptools,Distutils,我正在做一个独立于平台的PyQt应用程序。我打算使用setuptools编写setup.py文件。到目前为止,我已成功检测到平台,例如,根据平台为setup()加载特定选项,以便在Windows上使用py2exe。。。等等 然而,在我的应用程序中,我正在分发一些主题、HTML和图像,我需要在运行时将这些图像加载到应用程序中。到目前为止,它们存储在应用程序的主题/目录中 我一直在阅读关于setuptools和distutils的文档,并发现如果我给setup()提供data_files选项,将主题

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

我使用了一种称为数据文件的实用方法:

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。

您可以尝试:


你应该。它甚至可以在ziped eggs中工作。

如果数据文件安装在/usr/share/AppName/themes/中,而我的可执行文件类似于/usr/lib/AppName,那么它将如何工作。。。DistUtils文档说它将以sys.prefix作为前缀安装,作为我给数据文件存储的相对路径的前缀。。。On*nix系统数据文件可能也应该在/usr/share/AppName/中,我在setup.py中使用了package_data选项。不确定数据文件。好的。。。是的,包_数据也是一个选项。。。也许我应该这么做。。。我只是不认为它会生成符合Debian标准的软件包:)我的数据文件安装在xx.egg根目录中,而资源字符串试图从名称(在'xxx.egg/package/subpackage'中)获取它们,所以总是失败。@JensTimmerman:单击链接:“resource_name参数相对于命名的软件包进行解释”。因此,如果您的文件安装到xxx的包目录;使用xxx而不是
\uuuuu name\uuuuuu
,或者配置将文件安装到子包的目录中。它们安装在egg的根目录中,因此默认的包目录,但使用空字符串不起作用。如果我必须将其配置为安装在源代码的旁边,它似乎不会让事情变得更容易。。。
my_data = pkg_resources.resource_string(__name__, fname)