使用`setup.py` +`pip`

时间:2018-07-19 09:39:09

标签: python pip setup.py

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

但是,对于跨平台安装而言,这不是最佳选择,其中标准子目录将取决于系统。 此外,以开发人员模式安装软件包不会将文件放置在以后安装后的位置,从而使查找/使用资源的过程最终变得困难/难以调试。

我研究了appdirs,但是在安装过程中似乎很难使其正常工作,例如如果使用用户目录存储数据,这实际上与我的开发环境有关。

我之所以问这个原因是因为我有一个小型Python包,该包实现了一个简单的GUI,并且我希望随其一起提供一个图标。

为便于记录,我可以使用setup.py处理setuptools

2 个答案:

答案 0 :(得分:1)

如注释中所建议,对于捆绑资源文件,我宁愿使用package_data并将文件放置在某些包目录下。示例:

project
├── pkg1
│   ├── __init__.py
│   └── icons
│       └── image.png
└── pkg2
    └── __init__.py

包装setup.py脚本:

from setuptools import setup


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

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

import pkg_resources

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

跨平台支持因此由pkg_resources处理。有关可用的资源访问功能,请参见ResourceManager API

答案 1 :(得分:0)

更新 从@ solution

中检出hoefling

data_files选项指定要为您的软件包上传的文件。

来自docs

  

文件中没有目录信息用于确定已安装文件的最终位置;仅使用文件名。

如果要构建跨平台目录路径,请使用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')