Можно ли включать подкаталоги с использованием 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'],

Следуя этому синтаксису, вы можете включить подмодули в основной дистрибутив пакета.

Более подробную информацию обо всех остальных аргументах можно найти в документе.