[英]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 。
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.