首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有`data_files` +‘with’的跨平台支持

具有`data_files` +‘with’的跨平台支持
EN

Stack Overflow用户
提问于 2018-07-19 09:39:08
回答 2查看 1.1K关注 0票数 6

data_filessetup.py (兼容pip)的跨平台方式是什么?

在正式文件中,人们需要写:

代码语言:javascript
复制
setup(...,
    data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
                ('config', ['cfg/data.cfg']),
                ('/etc/init.d', ['init-script'])]
    )

'bitmaps'等是这些文件应该转到的子目录(相对于sys.prefix)。

然而,对于跨平台安装来说,这是次优的,因为标准的子dir将依赖于系统。此外,在开发人员模式下安装包不会将文件放在安装之后的位置,这使得查找/使用资源的过程最终很难/很烦人地进行调试。

我已经研究过appdirs,但在安装过程中似乎很难使它正常工作,例如,如果使用用户目录进行数据处理,它实际上会与我的开发环境绑定在一起。

我之所以问这个问题,是因为我有一个小型Python包,它实现了一个简单的GUI,并且我希望附带一个图标。

为了记录在案,我不介意用setuptools处理setuptools

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-19 16:03:10

正如注释中所建议的那样,对于捆绑资源文件,我宁愿使用package_data并将文件放在某个包dir下。示例:

代码语言:javascript
复制
project
├── pkg1
│   ├── __init__.py
│   └── icons
│       └── image.png
└── pkg2
    └── __init__.py

setup.py脚本中打包:

代码语言:javascript
复制
from setuptools import setup


setup(
    ...
    package_data={'pkg1': ['icons/image.png']},
)

更新用于访问代码中的资源文件:

Python3.7引入了importlib.resources,它取代了旧的pkg_resources功能,并提供了一种利用pathlib的现代资源机器

代码语言:javascript
复制
filepath = importlib_resources.path('pkg1', 'icons/image.png')

对于Python3.6和更高版本,有一个名为importlib_resources的后端。因此,版本不可知论的例子是:

代码语言:javascript
复制
import sys

if sys.version_info >= (3, 7):
    from importlib import resources as importlib_resources
else:
    import importlib_resources

filepath = importlib_resources.path('pkg1', 'icons/image.png')

在可能的情况下使用importlib_resources而不是pkg_resources

原来的答案,只适用于历史

若要引用代码中的资源文件,请使用pkg_resources

代码语言:javascript
复制
import pkg_resources

filepath = pkg_resources.resource_filename('pkg1', 'icons/image.png')

因此,跨平台支持由pkg_resources处理。有关可用资源访问函数,请参阅API接口

票数 4
EN

Stack Overflow用户

发布于 2018-07-19 09:49:54

更新从@霍夫中签出解决方案

data_files选项指定要上载的包文件。

来自文档

不使用文件中的目录信息来确定已安装文件的最终位置;只使用文件的名称。

如果要构建跨平台目录路径,请使用os模块

代码语言:javascript
复制
import os

path = os.path.join('root', 'directory')

如果您想在有人试图构建您的包时确定平台,请使用sys模块

代码语言:javascript
复制
import sys

current_platform = sys.platform.lower()
is_windows = current_platform.startswith('win')
is_ubuntu =  'ubuntu' in current_platform
is_mac = 'darwin' in current_platform


if is_windows:
     ... # windows specific dayta

elif is_ubuntu:
     ....

else:
    raise Exception('Platform not supported')
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51419256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档