Пакет пространства имен Python прозрачная структура папок - PullRequest
0 голосов
/ 14 октября 2019

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

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

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

IЯ подумал, что это похоже на обычный пакет с модулями, но я пока не нашел способа установить его как пакет, в то время как mainintainign опцию установки только определенных модулей, поэтому я предположил, что пакет пространства имен должен предлагать эту опцию, но я не могу получитьдля работы с 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 install из собственного пакета , но я бы хотел избежать использования множества подпапок, так как это создает риск максимального ограничения ограничений длины пути моей системы (+ это смущает всех остальных). Как мне настроить различные файлы 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

1 Ответ

1 голос
/ 15 октября 2019

Вы можете использовать опцию 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, вероятно, также содержат множество вложенных подпакетов).

...