2017-12-20 4 views
0

ich eine Struktur des Verzeichnisses als solche mit foobar und alphabet Datenverzeichnisse zusammen mit dem Code something.py:Python Verpackung mehrere Unterpakete mit unterschiedlichen Datenverzeichnisse

\mylibrary 
    \packages 
     \foobar 
      foo.zip 
      bar.zip 
     \alphabet 
      abc.zip 
      xyz.zip 
      something.py 
    setup.py 

und das Ziel ist, so dass Benutzer die pip können installieren Modul als solche:

pip install mylibrary[alphabet] 

und das wird nur enthalten die Daten aus den packages/alphabet/* Daten und der python-Code. Ein ähnliches Verhalten sollte für pip install mylibrary[foobar] verfügbar sein.

Wenn der Benutzer installiert, ohne die Spezifikation:

pip install mylibrary 

Dann werden sie alle Datenverzeichnisse unter packages/ umfassen.

Zeit, ich habe das Schreiben versucht, die setup.py mit Python3.5 als solche:

import glob 
from setuptools import setup, find_packages 


setup(
    name = 'mylibrary', 
    packages = ['packages'], 
    package_data={'packages':glob.glob('packages' + '/**/*.txt', recursive=True)}, 
) 

, dass eine Verteilung mit allen Datenverzeichnisse erstellen, wenn Benutzer pip install mylibrary tun.

Wie sollte ich die setup.py so ändern, dass bestimmte Pip-Installationen wie pip install mylibrary[alphabet] möglich ist?

+0

Die Sache ist, 'setup.py' wird nie wissen, ob das Paket einfach oder mit Extras installiert wird. Diese Information wird nur von Installationstools (wie 'pip' oder' easy_install') verbraucht und wird niemals an das Setup-Skript übergeben. Die Extras, die Sie im Setup-Skript definieren, sind grob gesagt nur eine zusätzliche Anweisung für das Installationsprogramm: "Wenn Sie zusätzliche Keywords erhalten, sollten Sie das Paket plus ein Paket zusätzlicher Pakete installieren", das ist es. – hoefling

Antwort

0

Firs müssen Sie verpacken und alphabet und foobar als separate Pakete zu veröffentlichen als pip install mylibrary[alphabet] bedeutet

pip install mylibrary 
pip install alphabet 

Danach alphabet hinzufügen und foobar als extras:

setup(
    …, 
    extras = { 
     'alphabet': ['alphabet'], 
     'foobar': ['foobar'], 
    } 
) 

Die Schlüssel im Wörterbuch sind die in pip install mylibrary[EXTRA_NAME] verwendeten Namen, die Werte sind eine Liste von Paketnamen, die von PyPI installiert werden.

PS. Und nein, Sie können keine Extras verwenden, um einige Datendateien zu installieren, die nicht als Pakete von PyPI verfügbar sind.

Verwandte Themen