Also habe ich einen Einstiegspunkt in meinem setup.py [console_scripts] Abschnitt definiert. Der Befehl ist korrekt installiert und funktioniert gut, aber ich brauche eine Möglichkeit, den Pfad zum Skript programmatisch herauszufinden (z. B. bei Windows ist es etwa C: /my/virtual/env/scripts/my_console_script.exe). Ich brauche das, damit ich den Skriptpfad als Argument für andere Befehle übergeben kann, unabhängig davon, wo das Paket installiert ist. Setuputils stellt das pkg_resources
bereit, aber das scheint keine Möglichkeit zu bieten, tatsächlich nur die ladbaren Objekte in die rohen installierten Pfade zu bekommen.
Bearbeiten: Um den Anwendungsfall klar zu machen, hier ist das Setup.
Ich habe eine plugin-gesteuerte Anwendung, die mit verschiedenen lokalen Diensten kommuniziert. Eines dieser Plug-Ins ist mit der Alerting-Schnittstelle eines NMS-Pakets verknüpft. Das Alerting-Paket kann Warnungen nur an einen beliebigen Handler senden, indem es ein Skript aufruft - der auszuführende Pfad (der Eintrittspunkt console_scripts in diesem Fall) wird als vollständiger Pfad registriert - das ist der Pfad, den ich abrufen muss.
Nun, Sie könnten eine Option der Form --install-option="--install-scripts=/usr/local/bin"
an pip
übergeben und den Pfad selbst bestimmen. Aber ich verstehe, warum Sie das in einem plattformübergreifenden Projekt nicht fest codieren möchten.
Also müssen wir nur herausfinden, welches Verzeichnis setuptools
tatsächlich verwendet. Leider ist der Pfad in der Mitte einer ganzen Reihe von tatsächlichen Setup-Code, anstatt in einer separaten Funktion, die wir einfach aufrufen können.
Der nächste Schritt besteht darin, einen benutzerdefinierten Installationsbefehl zu schreiben, der den Pfad beobachtet und speichert. (Zu diesem Zweck könnten Sie auch % Beispiel: Mögliche Einwände: Manche Leute mögen keine Form der Code-Generierung. In diesem Fall ist es mehr wie eine Konfiguration, aber wenn Sie es in ein An der Oberfläche sieht es aus wie ein bisschen wie ein Hack. % Co_de% wurde jedoch speziell entwickelt, um benutzerdefinierte Befehlsklassen zuzulassen. Nichts hier greift wirklich auf etwas Private zu, außer vielleicht den Wert, der mit dem Ermittelt nur das Verzeichnis, nicht die ausführbaren Namen. Sie sollten die Namen jedoch kennen, basierend auf Ihrer Einstiegspunktkonfiguration. Um die Namen zu erhalten, müssten Sie die Analysemethoden für Ihre Einstiegspunktspezifikation aufrufen und mehr Code generieren. Es wird einige Bugfixing benötigen, wenn Sie z.B. Build ohne zu installieren. Zusatz Dieser kleine Erkenntnisblitz ist vielleicht eleganter, da er nicht den Pfad irgendwo speichern muss, sondern den eigentlichen Pfad, den setuptools verwendet, obwohl davon ausgegangen wird, dass sich seit der Installation keine Konfiguration geändert hat. Addendum 2 Es wurde gerade erkannt / erinnert, dass
self.install_scripts
im Paket einfügen, ist es einfach, sich von Python-Code aus zu lösen. .py
-Objekt übergeben wird, was nur ein setuptools
vermeiden soll. distribution
ist jedoch sicher. global
ist möglich, benötigt aber eine andere Befehlsklasse. sdist
wird nicht aufgerufen und develop
wird nur aufgerufen, wenn Sie install
festgelegt haben. Ein benutzerdefinierter Befehl build_py
kann den Pfad wie im Beispiel use_2to3
erhalten, aber als develop
. Von dort aus müssen Sie entscheiden, ob Sie eine Datei in Ihr Quellverzeichnis schreiben möchten, die in install
steht - da sie später von self.script_dir
übernommen wird, obwohl es sich um dieselbe Datei (und den Build) handeln sollte Befehl wird die Datei trotzdem überschreiben) self.egg_path
ein install
in pip
erstellt. Dies ist eine Liste von Pfaden relativ zum Paketstamm aller Dateien einschließlich der Skripts. installed-files.txt
wird das bekommen. Es ist jedoch nur eine egg-info
Sache, die nicht von pkg_resources.get_distribution('mypackage').get_metadata('installed-files.txt')
erstellt wurde. Sie müssen die Zeilen durchsuchen, um nach dem Skriptnamen zu suchen, und dann den absoluten Pfad basierend auf dem Verzeichnis Ihres Pakets abrufen.
Sie können den Pfad für das Verzeichnis site_packages wie folgt abrufen:
%Vor%Wenn sich Ihr Skript irgendwo in Bezug auf diesen Pfad befindet, entweder in Site-Paketen oder in einem Verzeichnis, können Sie den relativen Pfad mit dem Site-Paket-Pfad wie folgt verbinden:
%Vor%Ein weiterer Trick, den Sie ausprobieren könnten, ist das Importieren des zugehörigen Moduls und dann den Parameter file . Sie können dann nach dem gleichen Skript wie im obigen Beispiel suchen, wenn Sie wissen, wie der relative Pfad zu dieser Datei lautet. Probieren Sie es in der Befehlszeile aus ..
%Vor%/usr/lib/python2.6/site-packages/django/ init .pyc
%Vor%Liegt der oben genannte Ratschlag auf der richtigen Spur?
Haben Sie in Ihrem Einstiegsskript 'os.path.abspath (__ file__)' ausprobiert? Es gibt den absoluten Pfad Ihres Einstiegspunktes zurück.
Oder rufen Sie find_executable
von distutils.spawn
:
import distutils.spawn
distutils.spawn.find_executable('executable')
Tags und Links python setuptools