Включение файлов, отличных от Python, без __init__.py с использованием package_data в setup.py?

Учитывая эту структуру каталогов (пустые __init__.py и logging.yml подойдут):

foo
│   setup.py
│
└─── foo
     │   __init__.py
     │
     └─── config
              logging.yml

Вот моя попытка, это setup.py:

from os import path
from setuptools import find_packages, setup

package_name = "foo"


if __name__ == "__main__":
    setup(
        name=package_name,
        packages=find_packages(),
        package_dir = {package_name: package_name},
        package_data = {"config":[path.join(package_name, "config", "logging.yml")]},
        include_package_data=True,
    )

# Also tried:
# package_data = {"config": [path.join("config", "logging.yml")]}
# package_data = {"": [path.join("config", "logging.yml")]}
# package_data = {"": [path.join(package_name, "config", "logging.yml")]}

Никаких ошибок после python setup.py install (также пробовал python -m pip install .), но запуск из корня моего виртуального окружения fd -HIFuuueyml logging не возвращает никаких результатов и отсутствует в foo.egg-info\SOURCES.txt.

PS: Тестирование локально с 3.13.0a5; инструменты настройки 69.2.0; пип 24.0. Но во время моего CI-тестирования и выпуска версий 2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12 для Windows, Linux и macOS.

Эта часть неверна независимо от данных упаковки: package_dir = {package_name: package_name}. См. документацию по адресу setuptools.pypa.io/en/latest/userguide/package_discovery.htm‌​l . С вашей структурой каталогов вам вообще не нужен package_dir; мой совет - удалить строку.

phd 30.03.2024 14:08

С помощью package_data = {"config":… вы заявляете, что config является пакетом. Но это не так. Итак, ответ на вопрос в заголовке: нет. Опять же, документация: setuptools.pypa.io/en/latest/userguide/datafiles.html

phd 30.03.2024 14:10

@phd — В своем комментарии я указываю другие способы, которыми я это сделал package_data. Я попробую удалить package_dir и посмотреть, исправит ли это проблему. Обновлено: Нет, это тоже не сработало. Перепробовал все варианты package_data, перечисленные в моем вопросе.

Samuel Marks 30.03.2024 16:01
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это работает:

from setuptools import find_packages, setup

package_name = "foo"


if __name__ == "__main__":
    setup(
        name=package_name,
        packages=find_packages(),
        package_data = {"foo": ["config/logging.yml"]},
        include_package_data=True,
    )

У вас только 1 (один) пакет foo, поэтому ваш package_data должен быть именно к этому пакету.

Ого, наконец-то я нашел свой logging.yml. Это C:\[dir]\Python\Python313\Lib\site-packages\foo, а не [virtualenv]\Lib\site-packages\foo. Хотя мой virtualenv определенно активирован. Хм.

Samuel Marks 30.03.2024 21:15

Хорошо, с py в Windows это работает на 3.13.0a5 и 2.7.18. Спасибо

Samuel Marks 30.03.2024 21:50

@SamuelMarks Каким-то образом вы установили пакет глобально, а не в [virtualenv]. Если вам удастся установить его в [virtualenv], вы обязательно найдете файл данных по адресу [virtualenv]\Lib\site-packages\foo\config\logging.yml.

phd 30.03.2024 21:57

Да, Windows вела себя странно. python.exe определенно был в [virtualenv], но пакеты устанавливались по всему миру. Переключение на py в активированном виртуальном окружении решило проблему.

Samuel Marks 30.03.2024 23:35

Другие вопросы по теме