Структура папок пакета пространства имен Python

Я хотел бы настроить пакет пространства имен python, содержащий несколько подключенных пакетов, которые необходимо устанавливать независимо, если явно не указаны зависимости. Однако существующие решения кажутся мне более или менее беспорядочными.

Например, один из пакетов содержит большую часть логики задач, а другие содержат вспомогательные функции, такие как построение графиков и экспорт данных. Пакет логики должен оставаться компактным и не может импортировать более numpy, тогда как другие пакеты могут использовать более сложные пакеты, такие как pandas и matplolib. Я хотел бы настроить структуру пакета, которая выглядит как результирующее пространство имен пакета пространства имен, но без ненужных вложенных папок, например это:

namespace
├── logic
│    ├── __init__.py
|    ├──  functions.py
│    └──  setup.py # requires numpy    
├── datastructure
│    ├── __init__.py
|    ├──  functions.py
│    └──  setup.py # requires namespace.logic and pandas
├── plotting
│    ├── __init__.py
|    ├──  functions.py
│    └──  setup.py # requires namespace.logic, namespace.datastructure and matplotlib
└── setup.py #should install every package in namespace

Я подумал, что это выглядит как обычный пакет с модулями, но я еще не нашел способа настроить его как пакет, в то время как поддерживаю возможность установки только определенных модулей, поэтому я предположил, что пакет пространства имен должен предлагать эту опцию, но я не совсем могу заставить его работать с pip

На данный момент мне потребуется еще два уровня каталогов, например:

namespace
├── NamespaceLogic          #don't want this
│   ├── namespace           #don't want this
│   │   └── logic
│   │       └── __init__.py
│   └── setup.py
├── NamespaceDatastructure  #don't want this
│   ├── namespace           #don't want this
│   │   └── datastructure
│   │       └── __init__.py
│   └── setup.py
├── NamespacePlotting       #don't want this
│   ├── namespace           #don't want this
│   │   └── plotting
│   │       └── __init__.py
│   └── setup.py
└── setup.py

Моя проблема похожа на этот вопрос: Python pip устанавливает подпакет из собственного пакета , но я бы хотел избежать множества подпапок, так как это создает риск максимального ограничения длины пути в моей системе (+ это сбивает с толку всех остальных). Как мне нужно настроить различные файлы setup.py, чтобы иметь возможность запускать

pip install namespace #installs namespace.logic, namespace.datastructure, namespace.plotting
pip install namespce.logic #installs only namspace.logic and works in an environment with numpy which does not have pandas or matplotlib

person mhwh    schedule 14.10.2019    source источник


Ответы (1)


Вы можете использовать опцию package_dir setuptools в своих интересах, чтобы избавиться от пустых папок для пакетов пространства имен:

NmspcPing
├── ping
│   └── __init__.py
└── setup.py
import setuptools
setuptools.setup(
    name='NmspcPing',
    version='0.0.0.dev0',
    packages=['nmspc.ping'],
    package_dir={'nmspc.ping': 'ping'},
)

Что-то вроде следующего также было бы возможно, но в зависимости от того, как проекты создаются или устанавливаются, файлы setup.py также могут быть включены как часть пакетов (что, вероятно, нежелательно):

.
├── ping
│   ├── __init__.py
│   └── setup.py
├── pong
│   ├── __init__.py
│   └── setup.py
└── setup.py

Если ограничение длины пути является проблемой, то лучше использовать более короткие имена пакетов. Потому что во многих случаях пакеты в любом случае устанавливаются со всеми уровнями каталогов (если только они не остаются заархивированными), даже если вы пропускаете их в своем репозитории исходного кода.

Честно говоря, я был бы удивлен, если бы проблема с ограничением длины пути действительно возникла, и я полагаю, что это все равно произойдет с вещами, которые вы не можете контролировать (например, сторонние пакеты: numpy, pandas, plotlib, вероятно, имеют много вложенных суб- пакеты тоже).

person sinoroc    schedule 14.10.2019