Доступ к файлам, отличным от Python, из другого пакета в среде PEP518 (pyproject.toml) - PullRequest
0 голосов
/ 19 июня 2020

Я хочу создать пакет Python (отсюда и mypackage), который включает файлы, отличные от Python (в моем случае это файлы заголовков C ++), которые будут доступны во время установки других пакетов. которые используют его как зависимость (отсюда и other_package).

Чтобы mypackage включал файлы в исходные дистрибутивы и делал те же файлы устанавливаемыми, я сделал следующее:

  • Включены файлы в файл пакета MANIFEST.in:
graft <folder_with_files>
  • Включены файлы в setup.py файл под data_files.
setup(
    name = 'mypackage',
    packages = ['mypackage'],
    ...
    data_files = ["folder_path", ("the", "files")]
)

До сих пор, имея их в обоих местах, mypackage корректно устанавливается с включенными файлами, отличными от Python, при использовании distutils, setuptools или pip (как локально, так и из PyPI ). При использовании setuptools и pip я могу найти файлы, отличные от Python, в folder_path в sys.prefix - например:

import sys, os
os.path.join(sys.prefix, "folder_path")

А при использовании distutils они в той же папке, что и файлы python, поэтому их можно найти через mypackage.__file__ - например,

import re, mypackage
re.sub(r"__init__\.py$", "", mypackage.__file__) + "folder_path"

Но вот проблема: когда другой пакет, который использует это как зависимость, имеет эту зависимость, указанную через PEP518 с файлом pyproject.toml, mypackage загружается из PyPI и устанавливается во временную среду, которую создает PEP518, но файлы, отличные от Python, НЕ находятся в sys.prefix - скорее, они устанавливаются под каким-то случайно названным временная папка, например:

$TEMP_FOLDER/pip-build-env-otci9gxx/overlay/folder_path

Таким образом, мой сценарий, который пытается найти файлы в sys.prefix или mypackage.__file__ root, не выбирает эти файлы.

Как я могу программно и детерминированно получить путь, по которому эти файлы установлены в среде PEP518, из setup.py из other_package?

1 Ответ

2 голосов
/ 20 июня 2020

Вы действительно хотите использовать data_files?

Я бы рекомендовал вместо этого использовать package_data. Таким образом, файлы являются частью самого Python пакета (например, установленного в site-packages) и их очень легко получить после установки.

Ресурсы :

Доступ к установленным пакетным данным одним из следующих способов:

1. pkgutil

import pkgutil
pkgutil.get_data('my_top_level_package.my_sub_package', 'file.bin')

2. importlib.resources

importlib.resources.read_binary('my_top_level_package.my_sub_package', 'file.bin')

3. pkg_resources

...