Я хочу создать пакет 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
?