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
()