2014-10-23 18 views
6

Próbuję ustawić pakiet z podpakietami w pythonie. Oto struktura drzewo, które mam w tej chwili:Właściwy sposób ustawiania pakietu Pythona z podpakietami

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

Wszystko __init__.py są puste. Oto moja setup.py:

from distutils.core import setup 

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

Problem polega na tym, że gdy uruchamiam python setup.py install z myPackage, że sub pakiety są instalowane w dist-packages:

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

Chyba problem jest mój setup.py, ale Nie wiem jak to naprawić? Powinien być w katalogu nadrzędnym myPackage? Jeśli tak, to jak to działa, gdy pakuję pakiet w zip przy użyciu python setup.py sdist?

Odpowiedz

3

TL; DR: Umieść pakiet w innym pakiecie o tej samej nazwie.

I zagnieżdżone super-pakiet myPackage wewnątrz katalogu (o tej samej nazwie), jak następuje:

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

Potem aktualizowana 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'] 
    ) 

Teraz sudo python setup.py install zachowuje się jak ja oczekiwać i w dist-packages Mam następującą strukturę:

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 

i plik jaj.

To prawie dobrze. Teraz nie jest niezależny od platformy z powodu użycia /. Aby rozwiązać ten problem, ja edytowany setup.py następująco:

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

Kopiowanie komentarz FoxDot za: Miałeś rację, aby zagnieździć pakietu jak zrobiłeś w odpowiedzi, ale nie musisz określać ścieżek za pomocą argumentu kluczowego package_dir, jeśli nazwy folderów odpowiadają już podpakietom itd. Znacznie lepiej wyjaśnić [tutaj] (https://docs.python.org/2/ distutils/examples.html # pure-python-distribution-by-package). – Richard

5

wystarczy użyć setuptools zamiast distutils, ma find_packages dokładnie do tego celu:

from setuptools import setup, find_packages 

setup(
    name='myPackage', 
    packages=find_packages(), 
) 
Powiązane problemy