2009-11-10 11 views
22

Ich habe eine Bibliothek namens "Beispiel", die ich in meinem globalen Site-Packages-Verzeichnis installieren. Ich möchte jedoch in der Lage sein, zwei Versionen zu installieren, eine für die Produktion und eine für das Testen (ich habe eine Webanwendung und andere Dinge, die auf diese Weise versioniert werden).Benutzerdefinierte Distutils Befehle

Gibt es eine Möglichkeit zu sagen, sagen wir "python setup.py stage", die nicht nur ein anderes Ei in site-packages installieren, sondern auch das Modul von "example" in "example_stage" oder ähnliches umbenennen?

Wenn Distutils das nicht können, gibt es noch ein anderes Tool?

Antwort

13

Sicher, Sie können distutils mit neuen Befehlen erweitern. In Ihrer distutil Konfigurationsdatei hinzufügen:

[global] 
command-packages=foo.bar 

dies in distutils.cfg im distutils Paket selbst sein kann, ..pydistutils.cfg in Ihrem Home-Verzeichnis (kein führender Punkt auf Windows) oder setup.cfg im aktuellen Verzeichnis.

Dann brauchen Sie ein foo.bar-Paket in Ihrem Python-site-packages-Verzeichnis.

Dann in diesem Paket hinzufügen Sie die Klassen den neuen gewünschten Befehle, wie stage Implementierung Subklassen distutils.cmd - die Dokumentation schwach sind, aber es gibt viele Beispiele, da alle vorhandenen distutils Befehle auch auf diese Weise gebaut werden.

+2

Dies beantwortet die gestellte Frage, aber virtualenv ist eine bessere Antwort auf das Problem. –

3

Siehe Alex's answer wenn Sie einen Weg, dies mit distutils zu tun, aber ich finde Paver besser für diese Art von Sache zu sein. Es macht es viel einfacher, benutzerdefinierte Befehle zu erstellen oder bestehende zu überschreiben. Außerdem ist der Übergang nicht besonders schwierig, wenn Sie an Distutils oder Setuptools gewöhnt sind.

+0

Paver bietet viele interessante praktische Funktionen und Verknüpfungen. Auf der anderen Seite fügt es ein weiteres Paradigma (und Architektur) über Distutils hinzu. Ich würde eine einfache setup.py-Datei bevorzugen, die in sich abgeschlossen ist und alles tut, was zu tun ist. –

49

Dies kann leicht mit distutils durch Unterklassen distutils.core.Command innerhalb von setup.py getan werden.

Zum Beispiel:

from distutils.core import setup, Command 
import os, sys 

class CleanCommand(Command): 
    description = "custom clean command that forcefully removes dist/build directories" 
    user_options = [] 
    def initialize_options(self): 
     self.cwd = None 
    def finalize_options(self): 
     self.cwd = os.getcwd() 
    def run(self): 
     assert os.getcwd() == self.cwd, 'Must be in package root: %s' % self.cwd 
     os.system('rm -rf ./build ./dist') 

Um den Befehl zu aktivieren, müssen Sie es in Setup-Referenz():

setup(
    # stuff omitted for conciseness. 
    cmdclass={ 
     'clean': CleanCommand 
} 

Beachten Sie, dass Sie auch auf diese Weise integrierte Befehle außer Kraft setzen können, wie zum Beispiel, was Ich habe mit 'sauber' gemacht. (Ich mochte nicht, wie die integrierte Version hinter dem ‚dist‘ links und ‚bauen‘ Verzeichnisse.)

% python setup.py --help-commands | grep clean 
    clean   custom clean command that forcefully removes dist/build dirs. 

Es gibt eine Reihe von Konventionen, die verwendet werden:

  • Sie geben beliebige Befehlszeilenargumente mit user_options.
  • Sie deklarieren alle Variablen, die Sie mit der Methode initialize_options() verwenden würden, die nach der Initialisierung aufgerufen wird, um Ihren benutzerdefinierten Namespace für die Unterklasse einzurichten.
  • Die finalize_options() Methode heißt kurz vor run().
  • Die Eingeweide des Befehls selbst werden in run() auftreten, so sicher sein, dass alle anderen Vorbereitungsarbeiten vor dem tun.

Das beste Beispiel ist die Verwendung nur für eine der Standardbefehle auf den Quellcode schauen, um bei PYTHON_DIR/distutils/command wie install.py oder build.py gefunden.

+0

Verwenden Sie die Quellen (https://bitbucket.org/pypy/pypy/src/9d88b4875d6e12570a635848524bb7f5283ee558/lib-python/2.7/distutils/command?at=translation-cleanup), Luke. –

+0

Und [lies die Dokumentation] (https://docs.python.org/2/distutils/apiref.html#creating-a-new-distutils-command). –

Verwandte Themen