Добавить папки и подпапки вне основного модуля, используя setuptools (setup.py) - PullRequest
1 голос
/ 08 января 2020

Так что это еще один похожий вопрос, но отличающийся от setuptools: добавление дополнительных файлов вне пакета и Включая не Python файлы с setup.py . У меня есть структура, очень похожая на структуру первого вопроса

-module
   -python_file1.py
   -python_file2.py
-folder
   -subfolder1
      -data_file_1.txt
   -subfolder2
      -data_file_2.txt

Что я хочу: Я хочу установить пакеты вместе с папкой, подпапками и файлами внутри них.

То, что я пробовал:

  • Approach_1: если я перемещу папку внутри модуля, тогда я могу легко использовать опцию package_data, такую ​​как

package_data = {'':['folder/**/*']} но это заставит меня сменить структуру на более грязную. Представьте, что у меня есть 10-15 подпапок.

  • Approach_2: используя опцию data_files, я мог получить список всех файлов, включая папки / подпапки и файл, просто отсканировав весь репо, используя glob.glob('my_repo'), но так как я не могу контролировать (или, возможно, я не знаю ни одного) целевой каталог в зависимости от разных ОС, поэтому я не могу переместить файлы в нужном целевом каталоге.

Я ищу элегантное решение для любого из подходов. Пример файла setup.py только для справки:

from setuptools import setup, find_packages

setup(
    name='your_project_name',
    version='0.1',
    description='A description.',
    packages=find_packages(),
    package_data={'': ['folders/**/*'},
    include_package_data=True,
    install_requires=[],
)

1 Ответ

0 голосов
/ 09 января 2020

Я полагаю, что что-то вроде следующего может привести вас туда:

.
├── data
│   ├── file.txt
│   └── foo
│       ├── bar
│       │   └── file.txt
│       └── file.txt
├── MANIFEST.in
├── setup.cfg
├── setup.py
└── src
    └── thing
        ├── __init__.py
        └── nothing
            └── __init__.py

MANIFEST.in

# ...
recursive-include data *.txt

setup.py

#!/usr/bin/env python3

import pathlib
import setuptools

def main():
    data_packages = [
        'thing/{}'.format(p).replace('/', '.')
        for p
        in pathlib.Path('data').glob('**')
    ]
    packages = setuptools.find_packages(where='src')
    package_dir = {
        'thing': 'src/thing',
        'thing.data': 'data'
    }

    setuptools.setup(
        # see 'setup.cfg'
        packages=packages + data_packages,
        package_dir=package_dir,
        include_package_data=True,
    )

if __name__ == '__main__':
    main()

*.txt упакованы как данные пакета в пакете thing.data проекта Python. Данные можно прочитать, например, так:

python3 -c "import pkgutil; print(pkgutil.get_data('thing', 'data/foo/bar/file.txt').decode())"
...