2014-09-19 3 views
1

У меня есть несколько пакетов, которые более или менее независимы (см. Apack и bpack ниже). Я хотел бы, чтобы они все доступны, как это:Как организовать мои пакеты под некоторым корневым пакетом в PyPi?

import mycompany.apack.somemodule 
import mycompany.bpack.somemodule 

Поскольку они независимы у меня есть отдельный setup.py для каждого из них, чтобы развернуть их PyPi и, следовательно, различный цикл выпуска.

Вопрос: Возможно ли иметь подпакеты корневого пакета с разделенной процедурой освобождения (каждый подпакет имеет собственную setup.py)? Как это сделать?

Вот что я пытался, но не смог заставить его работать. Моего текущий setup.py выглядит следующим образом:

from distutils.core import setup 
setup(
    name='mycompany-apack', 
    version='0.1', 
    packages=['mycompany.apack'], 
    license='GPLv3') 

Этого setup.py создает следующую структуру в папке Расс-пакетах:

mycompany 
    apack 
    __init__.py 
    somemodule.py 
    bpack 
    __init__.py 
    somemodule.py 

Теперь, так как мой MyCompany не имеет __ инициализация __.py (это мое предположение) я получаю следующее сообщение об ошибке:

>>> import mycompany.apack.somemodule 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named mycompany.apack.somemodule 
+0

И здесь очень похож вопрос, если не то же самое: http://stackoverflow.com/questions/5064951/packaging-common-python-namespaces – vladimir

ответ

2

Короткий ответ

Используйте pkg_resources.declare_namespace от проекта setuptools.

Длинный ответ

Вы можете использовать Setuptools вместо Distutils. Он поддерживает управление и пространства имен зависимостей,

Для apack структуры проекта будет выглядеть следующим образом:

/apack/ 
|- mycompany/ 
| |- __init__.py (1) 
| `- apack/ 
|  |- __init__.py 
|  `- submodule.py 
`- setup.py 

Для apack вашего setup.py будет выглядеть следующим образом:

from setuptools import find_packages 
from setuptools import setup 

setup(
    name='apack', 
    version='0.1', 
    packages=find_packages()) 

__init__.py помечены как (1) будет выглядеть так:

import pkg_resources 
pkg_resources.declare_namespace(__name__) 

bpack будет выглядеть очень похоже, кроме как с apack заменен на bpack.

Предположим, что есть также cpack, который зависит от apack и bpack.

Это будет выглядеть, но setup.py будет выглядеть следующим образом:

from setuptools import find_packages 
from setuptools import setup 

setup(
    name='cpack', 
    version='0.1', 
    packages=find_packages(), 
    install_requires=['apack', 'bpack']) 

Если CPack установлен, apack и bpack будут установлены также. Из декларации пространства имен, никаких конфликтов не происходит

$ virtualenv venv 
$ source virtualenv/bin/activate 
$ pip install cpack 
$ python 
>>> from mycompany.apack import submodule 
>>> from mycompany.bpack import submodule 
>>> from mycompany.cpack import submodule 
+0

Я попробовал этот путь , Если я устанавливаю оба apack и bpack, а затем удаляю apack, bpack становится невозможен. Это происходит потому, что удаление apack приводит к удалению пакета/__ init __.py И это точно та же проблема, что и у distutils, если я начну устанавливать корневой пакет из apap и bpack. Пока setuptools и distutils одинаковы ... – vladimir

+0

Ключевым моментом, отсутствующим в ответе, является использование namespace_packages в установочном вызове. Только это сделает «пространство имен» из пакета корневого пакета – vladimir

Смежные вопросы