Распространение субмодулей пакета пространства имен

Я реорганизовал свой проект на Python под тем же именем. Мой проект теперь можно рассматривать как несколько подсистем, которые могут зависеть друг от друга. Это означает, что теперь каждый подмодуль может распространяться отдельно, так что могут быть установлены только необходимые зависимости.

Старая структура:

/
├─ myproj/
│  ├─ __init__.py
│  ├─ mod1.py
│  ├─ subpackage1/
│  └─ subpackage2/
└─ setup.py

Новая структура:

/
├─ myproj/
│  ├─ common/ 
│  │  └─ mod1.py
│  ├─ subpackage1/
│  └─ subpackage2/
└─ setup.py

Как видите, мало что изменилось, кроме myproj теперь пакет пространства имен и субпакеты common, subpackage1 а также subpackage2 теперь можно распространять самостоятельно.

Возможно ли, сохраняя один уникальный setup.py файл, чтобы создать 3 независимых пакета?

  • myproj.common
  • myproj.subpackage1
  • myproj.subpackage2

Также я хотел бы указать, что при установке myproj.subpackage1, myproj.common требуется или что myproj.subpackage2 потребует как myproj.common а также myproj.subpackage1,

1 ответ

Решение

Как сказал Мартейн Питерс, это всего лишь код на python, так что да, вы можете сделать это. Я даже не думаю, что это будет слишком сложно.

По сути, вы просто хотите манипулировать аргументами командной строки в setup.py

import sys

if sys.argv[1] == "subpackage1":
    # Remove the first command line argument so the setup function works normally.
    sys.argv.pop(1)

    # Run setup code for subpackage1 or 
    # Use a separate setup file and call "import setup_subpackage1"
    ...
elif sys.argv[1] == "subpackage2":
    # Remove the first command line argument so the setup function works normally.
    sys.argv.pop(1)

    # Run setup code for subpackage2 or
    # Use a separate setup file and call "import setup_subpackage2"
    ...
else:
    # Check if they gave common as an argument or just left if blank
    if sys.argv[1] == "common":
        # Remove the first command line argument so the setup function works normally.
        sys.argv.pop(1)

    # Run setup code for both packages.
    ...

Еще раз, хотя, как заявил Мартейн Питерс, это, вероятно, не стоит усилий. Основная философия Python заключается в том, что простое лучше, чем сложное. Если ваши два подпакета совершенно разные, то, возможно, это должны быть разные проекты.

Пример: Сципи

Я пытался придумать пример, почему бы не сделать это, но, видимо, scipy Является ли это. Так что я могу ошибаться, пытаясь отговорить вас. Тем не менее, вероятно, не стоит усилий, потому что большинство людей просто pip install scipy,

Это интересно. Структура Сципи очень хорошо продумана. Scipy имеет каждый подпакет как пакет Python (каталог с файлом __init__.py.). Внутри каждого пакета есть файл setup.py. Они также используют numpy.distutils.misc_util.Configuration добавить подпакеты.

Если вы посмотрите их исходный код, основной файл scipy setup.py выглядит следующим образом.

from __future__ import division, print_function, absolute_import

import sys


def configuration(parent_package='',top_path=None):
    from numpy.distutils.misc_util import Configuration
    config = Configuration('scipy',parent_package,top_path)
    config.add_subpackage('cluster')
    config.add_subpackage('constants')
    config.add_subpackage('fftpack')
    config.add_subpackage('integrate')
    config.add_subpackage('interpolate')
    config.add_subpackage('io')
    config.add_subpackage('linalg')
    config.add_data_files('*.pxd')
    config.add_subpackage('misc')
    config.add_subpackage('odr')
    config.add_subpackage('optimize')
    config.add_subpackage('signal')
    config.add_subpackage('sparse')
    config.add_subpackage('spatial')
    config.add_subpackage('special')
    config.add_subpackage('stats')
    config.add_subpackage('ndimage')
    config.add_subpackage('_build_utils')
    config.add_subpackage('_lib')
    config.make_config_py()
    return config

if __name__ == '__main__':
    from numpy.distutils.core import setup
    setup(**configuration(top_path='').todict())

Похоже, хорошее решение для вас уже найдено.

Другие вопросы по тегам