Можно ли включать подкаталоги с использованием dist utils (setup.py) в качестве части данных пакета?
В основном мой пакет python настроен так:
module
\_examples
\_folder1
\_file1.py
\_file2.py
\_folder2
\_file1.py
\_file2.py
В основном я хочу просто использовать:
package_data = {
'module': ['examples/*'],
},
потому что в моем проекте всегда есть люди, добавляющие примеры, и я хочу, чтобы их было легко перечислить из моего приложения. Я могу заставить его работать для любого FILE в примерах, но не повторять прокрутку через подкаталоги. Возможно ли это?
Ответы
Ответ 1
Я считаю, что вы ищете что-то вроде этого для вас setup.py
, который рекурсивно найдет все пакеты в проекте, а также обязательно включит файлы __init__.py
в подкаталоги для каждого пакета, который вы хотите.
from setuptools import setup, find_packages
setup(name='MySoftware',
packages=find_packages()
)
Ответ 2
Для этого вам понадобится MANIFEST.in
файл.
Я считаю, что вам нужно что-то вроде этого:
$ cat MANIFEST.in
recursive-include examples/ *.py
Ответ 3
Да, вы можете включить все подкаталоги.
Вам просто нужно передать приведенные ниже аргументы функции setup():
packages=find_packages()
include_package_data=True
Наряду с этим вам необходимо иметь файл MANIFEST.in с содержимым
recursive-include examples *
Это гарантирует, что все файлы будут рекурсивно включены.
Если вы хотите специально исключить определенные расширения, вы можете сделать это, указав exclude array в аргументе find_packages()
.
Пример: исключить .txt
файлы
packages=find_packages(exclude=['.txt'])
Подробнее о include_package_data
здесь.
А также здесь - это еще одна ссылка, которая говорит вам, когда вы не должны использовать include_package_data
Ответ 4
После того, что сказал Дэвид Волевер, просто чтобы было немного яснее. Если вы хотите включить все в папку подкаталога, вы должны явно указать каждый файл в файле MANIFEST.in,
recursive-include examples/*.py *.png *.sh
т. д.....
Было бы хорошо, если бы manifest.in просто разбирался в examples/
и включал бы все, ну да ладно.
Ответ 5
Ни один из предложенных ответов не сработал для меня в подобной ситуации.
Мне нужно было сделать дистрибутив с моим пакетом, который включал несколько sdist
в sdist
, так что это были файлы, которые мне нужны для перехода в sdist
:
ipyexperiments/*py
ipyexperiments/utils/*py
и что бы я ни пытался, в подкаталоге utils
модули были не получают включены в sdist
.
То, что работало для меня, оставляет config.py
умолчанию:
# config.py
from setuptools import setup, find_packages
[...]
setup(
packages = find_packages(),
[...]
)
но добавляя в MANIFEST.in
:
# MANIFEST.in
graft ipyexperiments
и все под ipyexperiments
было включено.
Я также добавил в MANIFEST.in
prune tests
global-exclude *.py[co]
исключить все каталоги tests
и любые ненужные *pyc
и *.pyo
любом месте.
Ответ 6
Вступление
Я наткнулся на этот пост и потратил некоторое время на выяснение того, как добавить конкретные подмодули в мой пакет, поэтому я опубликую свое решение здесь.
Решение
В моей корневой папке пакета у меня есть файл setup.py
см. Документ
В этом файле у меня есть следующий код:
from setuptools import setup
with open("README.md", "r") as fh:
long_description = fh.read()
setup(
name='package name',
version='0.4.1',
description='short description',
long_description=long_description,
long_description_content_type="text/markdown",
url='repository url',
author='My name',
author_email='[email protected]',
license='MIT',
packages=['PackageName','PackageName.SubModule'],
zip_safe=False,
install_requires=[
'dependecy1',
],
classifiers=[
'Development Status :: 3 - Alpha',
'License :: OSI Approved :: MIT License',
'Programming Language :: Python :: 3.7'
]
)
Интересная часть, чтобы ответить на вопрос, здесь: packages=['PackageName','PackageName.SubModule'],
Следуя этому синтаксису, вы можете включить подмодули в основной дистрибутив пакета.
Более подробную информацию обо всех остальных аргументах можно найти в документе.