Erhalte ich einen Speicherort für die Einstiegspunkte-Skriptdatei im setuputils-Paket?

8

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.

    
Tyler Eaves 31.07.2014, 18:11
quelle

3 Antworten

4

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:

%Vor%

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 self.install_scripts im Paket einfügen, ist es einfach, sich von Python-Code aus zu lösen.

  • 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 .py -Objekt übergeben wird, was nur ein setuptools vermeiden soll.

  • 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. 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)

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.

%Vor%

Addendum 2

Es wurde gerade erkannt / erinnert, dass 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.

    
Jason S 07.08.2014, 07:30
quelle
2

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?

    
Ron 06.08.2014 19:54
quelle
2

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 :

auf

import distutils.spawn distutils.spawn.find_executable('executable')

    
Felipe Cruz 06.08.2014 19:20
quelle

Tags und Links