Python-Setup, installiere ein Modul als Submodul eines anderen Moduls?

Ich möchte ein Paket erstellen, das in ein Submodul eines anderen Pythonpakets als Erweiterung installiert wird.

Grundsätzlich ist das Originalmodul so aufgebaut:

origmodule/ __init__.py stuff.py ext/ __init__.py # This module is empty 

Und dann habe mein Erweiterungsmodul in das leere origmodule.ext Modul installiert. Wenn man die Anweisungen für distutils , war es nicht klar, ob dies möglich oder unterstützt ist. Das Endziel ist so, dass mein Erweiterungsmodul einmal installiert wurde wie folgt importiert werden:

import origmodule.ext.my_extension

One Solution collect form web for “Python-Setup, installiere ein Modul als Submodul eines anderen Moduls?”

Sie können das nicht mit setuptools machen, die Installation in einem anderen Paket wird nicht unterstützt.

Stattdessen möchten Sie stattdessen Einstiegspunkte verwenden. Ihr origmodule sollte nach etwas suchen, das als Einstiegspunkt für einen bestimmten Schlüssel registriert ist, und Ihr extension sollte sich für diesen Schlüssel anmelden.

Ihre Erweiterung registriert einen Erweiterungspunkt:

 entry_points={ 'some.opaque.string.unique.to.origmodule': ['my_extension = my.extension.package:some.entry.point', ] } 

Die dein origmodule dann entdecken kann, indem du origmodule pkg_resources :

 import pkg_resources for entrypoint in pkg_resources.iter_entry_points(group='some.opaque.string.unique.to.origmodule'): extension = entrypoint.load() 

Werfen Sie einen Blick auf das Babel-Projekt als Beispiel. Babel kann übersetzbaren Text aus Dateien extrahieren; Es weiß, wie dies für Python-Quellcode zu tun, aber es unterstützt auch Erweiterungen, die diesen Text aus anderen Formaten extrahieren können.

Solche Extraktionsmethoden können als Erweiterungspunkte registriert werden. Babel dokumentiert dies im Abschnitt " Extraktionsmethoden schreiben ". Der Nachrichtenextraktionscode lädt dann die Einstiegspunkte beim Extrahieren von Text:

 GROUP_NAME = 'babel.extractors' # ... for entry_point in working_set.iter_entry_points(GROUP_NAME, method): func = entry_point.load(require=True) break 

Die Mako Templating Sprache liefert ein solches Plugin; Es registriert den Einstiegspunkt , der auf die eigentliche Umsetzung hinweist:

 [babel.extractors] mako = mako.ext.babelplugin:extract 
 def extract(fileobj, keywords, comment_tags, options): # ... 
  • Wie schreibe ich ein setup.py für ein Twistd / Twisted Plugin, das mit setuptools arbeitet, verteilen, etc?
  • Neueste "Pip" scheitert mit "erfordert setuptools> = 0.8 für dist-info"
  • Setuptools: SVN-Revision aus einem übergeordneten Verzeichnis finden
  • Easy_install mit pypy während Python installiert ist
  • Wie kann ich nach dem Erstellen einer virtuellen Umgebung globale Pakete in eine virtuelle Umgebung verschieben?
  • Ermittlung der Version von easy_install / setuptools
  • Was ist der offizielle "bevorzugte" Weg, um Pip und virtualenv systemweit zu installieren?
  • Kann python setup.py installieren Räder benutzen?
  • Pip install traceback Fehler beim Installieren von Paketen in Python
  • Setuptools beunruhigt - ohne Pakete, einschließlich Datendateien
  • Python setuptools: wie man eine Konfigurationsdatei für die Verteilung in <prefix> / etc einfügt
  • Python ist die beste Programmiersprache der Welt.