2014-10-23 3 views
6

Я пытаюсь установить пакет с подпакетами в python. Вот структура дерева, что у меня есть на данный момент:Правильный способ установки пакета python с подпакетами

myPackage 
├── __init__.py 
├── mySubPackage1 
│   ├── foo2.py 
│   ├── foo.py 
│   └── __init__.py 
├── mySubPackage2 
│   ├── bar2.py 
│   ├── bar.py 
│   └── __init__.py 
└── setup.py 

Все __init__.py пусты. Вот мой setup.py:

from distutils.core import setup 

if __name__ == "__main__": 
    setup(
     name='myPackage', 
     package_dir = { 
      'mySubPackage1': 'mySubPackage1', 
      'mySubPackage2': 'mySubPackage2'}, 
     packages=['mySubPackage1', 'mySubPackage2'], 
    ) 

Проблема заключается в том, что, когда я бегу python setup.py install от myPackage, то суб пакеты устанавливаются в dist-packages:

/usr/local/lib/python2.7/dist-packages/mySubPackage1 
/usr/local/lib/python2.7/dist-packages/mySubPackage2 

Я думаю, проблема в том, что я setup.py, но Я не знаю, как это исправить? Должно ли оно находиться в родительском каталоге myPackage? Если да, то как это работает, когда я упаковываю пакет в zip, используя python setup.py sdist?

ответ

3

TL; DR: гнездо пакет в другой упаковке с тем же именем.

Я вложенный супер-пакет myPackage внутри каталога (с тем же именем) следующим образом:

myPackage 
├── myPackage 
│   ├── __init__.py 
│   ├── mySubPackage1 
│   │   ├── foo1.py 
│   │   ├── foo2.py 
│   │   └── __init__.py 
│   └── mySubPackage2 
│    ├── bar1.py 
│    ├── bar2.py 
│    └── __init__.py 
└── setup.py 

Затем я обновил setup.py:

from distutils.core import setup 
if __name__ == "__main__": 
    setup(
     name='myPackage', 
     package_dir = { 
      'myPackage': 'myPackage', 
      'myPackage.mySubPackage1': 'myPackage/mySubPackage1', 
      'myPackage.mySubPackage2': 'myPackage/mySubPackage2'}, 
     packages=['myPackage', 'myPackage.mySubPackage1', 
        'myPackage.mySubPackage2'] 
    ) 

Теперь sudo python setup.py install ведет себя, как я ожидаем и в dist-packages У меня следующая структура:

myPackage 
├── __init__.py 
├── __init__.pyc 
├── mySubPackage1 
│   ├── foo1.py 
│   ├── foo1.pyc 
│   ├── foo2.py 
│   ├── foo2.pyc 
│   ├── __init__.py 
│   └── __init__.pyc 
└── mySubPackage2 
    ├── bar1.py 
    ├── bar1.pyc 
    ├── bar2.py 
    ├── bar2.pyc 
    ├── __init__.py 
    └── __init__.pyc 

и файл с яйцом.

Это почти хорошо. Теперь он не является независимым от платформы из-за использования /. Чтобы это исправить, я редактировал setup.py следующим образом:

from distutils.core import setup 
from distutils import util 
if __name__ == "__main__": 
    pathMySubPackage1 = util.convert_path('myPackage/mySubPackage1') 
    pathMySubPackage2 = util.convert_path('myPackage/mySubPackage2') 
    setup(
     name='myPackage', 
     package_dir = { 
      'myPackage': 'myPackage', 
      'myPackage.mySubPackage1': pathMySubPackage1, 
      'myPackage.mySubPackage2': pathMySubPackage2}, 
     packages=['myPackage', 'myPackage.mySubPackage1', 
        'myPackage.mySubPackage2'] 
    ) 
+1

Копирование комментарий FoxDot: вы были правы гнезде пакет как вы ответили, но вам не нужно указывать пути, используя аргумент ключевого слова package_dir, если имена ваших папок уже соответствуют подпакетам и т. д. Это намного лучше объяснено [здесь] (https://docs.python.org/2/ Distutils/examples.html # чисто питон-распределение-по-пакета). – Richard

5

Просто использовать setuptools вместо distutils, он имеет find_packages именно для этой цели:

from setuptools import setup, find_packages 

setup(
    name='myPackage', 
    packages=find_packages(), 
) 
Смежные вопросы