2014-10-23 14 views
6

Ich versuche, ein Paket mit Unterpaketen in Python zu setzen. Hier ist die Baumstruktur, die ich im Moment haben:Richtiger Weg, um Python-Paket mit Sub-Pakete zu setzen

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

Alle __init__.py leer sind. Hier ist meine setup.py:

from distutils.core import setup 

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

Das Problem ist, dass, wenn ich laufe python setup.py install von myPackage, die Unter Pakete installiert sind in dist-packages:

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

Ich denke, das Problem ist mein setup.py, aber Ich weiß nicht, wie ich das beheben soll. Sollte es im übergeordneten Verzeichnis von myPackage sein? Wenn ja, wie funktioniert es, wenn ich das Paket in eine zip unter Verwendung python setup.py sdist verpacke?

Antwort

3

TL; DR: Verschachteln Sie das Paket in einem anderen Paket mit demselben Namen.

ich den Super-Paket myPackage in einem Verzeichnis verschachtelt (mit dem gleichen Namen) wie folgt:

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

Dann habe ich die setup.py aktualisiert:

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

Nun sudo python setup.py install verhält sich wie ich erwarten und in dist-packages habe ich die folgende 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 

und eine Eifeile.

Das ist fast gut. Jetzt ist es nicht plattformunabhängig wegen der Verwendung von /. Um dies zu beheben, ich setup.py wie folgt bearbeitet:

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

Kopieren FoxDot Kommentar: Sie hatten Recht zu nisten das Paket wie Sie haben dies in der Antwort getan, aber Sie müssen keine Pfade mit dem Schlüsselwort package_dir angeben, wenn Ihre Ordnernamen bereits mit den Unterpaketen usw. übereinstimmen. Es ist viel besser erklärt [hier] (https://docs.python.org/2/ distutils/examples.html # pure-python-Verteilung nach Paket). – Richard

5

Nur setuptools statt distutils verwenden, hat es find_packages genau zu diesem Zweck:

from setuptools import setup, find_packages 

setup(
    name='myPackage', 
    packages=find_packages(), 
) 
Verwandte Themen