Python 跨平台支持带有setup.py和x2B的“数据”文件`皮普`
使用Python 跨平台支持带有setup.py和x2B的“数据”文件`皮普`,python,pip,setup.py,Python,Pip,Setup.py,使用setup.py(与pip兼容)跨平台传送数据_文件的方式是什么 根据官方文件,需要写下: setup(..., data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']), ('config', ['cfg/data.cfg']), ('/etc/init.d', ['init-script'])] ) 和“位图”等是这些文件应该放在的子目录(相对于sys.pref
setup.py
(与pip
兼容)跨平台传送数据_文件的方式是什么
根据官方文件,需要写下:
setup(...,
data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
('config', ['cfg/data.cfg']),
('/etc/init.d', ['init-script'])]
)
和“位图”
等是这些文件应该放在的子目录(相对于sys.prefix
)
但是,对于标准sub-dir将取决于系统的跨平台安装,这是次优的。
此外,在开发人员模式下安装包不会将文件放在安装后的位置,这使得查找/使用资源的过程最终很难调试
我已经研究了appdirs
,但在安装过程中似乎很难使其正常工作,例如,如果使用用户目录存储数据,这实际上与我的开发环境有关
我问这个问题的原因是因为我有一个实现简单GUI的小Python包,我想附带一个图标
作为记录,我可以用setup.py
处理setuptools
更新
请从@
data\u files
选项指定要为包上载的文件
从:
文件中的目录信息不用于确定安装文件的最终位置;仅使用文件名
如果要构建跨平台目录路径,请使用os
模块
import os
path = os.path.join('root', 'directory')
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')
如果您想在有人试图构建您的包时确定平台,请使用sys
模块
import os
path = os.path.join('root', 'directory')
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')
正如评论中所建议的,对于捆绑资源文件,我宁愿使用package_数据并将文件放在某个package 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引入,它取代了旧的pkg\u资源
功能,并提供了一种利用pathlib
的现代资源机制:
filepath = importlib_resources.path('pkg1', 'icons/image.png')
对于Python3.6及更早版本,有一个名为的后端口。因此,版本不可知的示例如下:
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')
尽可能使用importlibu\u资源
而不是pkg\u资源
原始答案,仅用于历史
要引用代码中的资源文件,请使用pkg_resources
:
import pkg_resources
filepath = pkg_resources.resource_filename('pkg1', 'icons/image.png')
因此,跨平台支持由pkg\u资源
处理。有关可用的资源访问函数,请参阅。这不是在生成时定义目录吗(就像使用appdirs
那样)因此,呈现这种方法对跨平台场景几乎没有任何帮助?请注意,绝对目标路径无论如何不会与pip
一起工作,因为所有绝对data\u文件
目标都将与站点包
相对应,有关更多详细信息,请参阅我的答案。对于捆绑资源文件,我宁愿使用package\u data
并将文件放在某个package目录下。然后,您可以跨平台引用带有pkg\u resources.resource\u file()
等的文件。谢谢您的提示。我最终将package\u data
与pkg\u resources.resource\u filename()
结合使用。奇怪的是,使用package_data
,我无法使用Python 2构建包(尽管生成的包与Python 2兼容)。如果你把你的评论作为一个回答,我很乐意接受。你是在建立一个源区还是一个轮子?你有什么错误?如果您用错误详细信息更新了您的问题(或询问一个新问题并将其链接到此处),我将尝试提供帮助。sys.version
可能应该通过sys.version\u info
()