簡體   English   中英

使用 `setup.py` + `pip` 對 `data_files` 的跨平台支持

[英]Cross-platform support for `data_files` with `setup.py` + `pip`

使用setup.py (與pip兼容)傳送data_files的跨平台方式是什么?

從官方文檔來看,需要這樣寫:

setup(...,
    data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
                ('config', ['cfg/data.cfg']),
                ('/etc/init.d', ['init-script'])]
    )

'bitmaps'等是這些文件應該去的子目錄(相對於sys.prefix )。

但是,這對於標准子目錄將取決於系統的跨平台安裝來說是次優的。 此外,在開發人員模式下安裝包不會將文件放置在安裝后的位置,這使得查找/使用資源的過程最終很難/煩人地調試。

我已經研究過appdirs ,但似乎很難在安裝過程中使其正常工作,例如,如果使用用戶目錄獲取數據,這實際上與我的開發環境相關聯。

我問這個的原因是因為我有一個實現簡單 GUI 的小型 Python 包,我想隨附一個圖標。

作為記錄,我可以使用setuptools處理setup.py

正如評論中所建議的,對於捆綁資源文件,我寧願使用 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']},
)

在代碼中訪問資源文件的更新:

Python 3.7 引入了importlib.resources ,它取代了舊的pkg_resources功能並提供了一個利用pathlib的現代資源機制:

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

對於 Python 3.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處理。 有關可用的資源訪問功能,請參閱ResourceManager API

更新@hoefling查看解決方案

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM