data_files与setup.py (兼容pip)的跨平台方式是什么?
在正式文件中,人们需要写:
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。
发布于 2018-07-19 16:03:10
正如注释中所建议的那样,对于捆绑资源文件,我宁愿使用package_data并将文件放在某个包dir下。示例:
project
├── pkg1
│ ├── __init__.py
│ └── icons
│ └── image.png
└── pkg2
└── __init__.py在setup.py脚本中打包:
from setuptools import setup
setup(
...
package_data={'pkg1': ['icons/image.png']},
)更新用于访问代码中的资源文件:
Python3.7引入了importlib.resources,它取代了旧的pkg_resources功能,并提供了一种利用pathlib的现代资源机器
filepath = importlib_resources.path('pkg1', 'icons/image.png')对于Python3.6和更高版本,有一个名为importlib_resources的后端。因此,版本不可知论的例子是:
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
import pkg_resources
filepath = pkg_resources.resource_filename('pkg1', 'icons/image.png')因此,跨平台支持由pkg_resources处理。有关可用资源访问函数,请参阅API接口。
发布于 2018-07-19 09:49:54
data_files选项指定要上载的包文件。
来自文档
不使用文件中的目录信息来确定已安装文件的最终位置;只使用文件的名称。
如果要构建跨平台目录路径,请使用os模块
import os
path = os.path.join('root', 'directory')如果您想在有人试图构建您的包时确定平台,请使用sys模块
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')https://stackoverflow.com/questions/51419256
复制相似问题