Распространение субмодулей пакета пространства имен
Я реорганизовал свой проект на 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())
Похоже, хорошее решение для вас уже найдено.