2009-12-14 13 views
6

Wir haben eine gemeinsame Python-Installation für alle unsere Systeme, um sicherzustellen, dass jedes System die gleiche Python-Installation hat und um Konfigurationsprobleme zu vermeiden. Diese Installation befindet sich auf einem freigegebenen Laufwerk. Wir haben auch mehrere Plattformen, die diese Installation teilen. Wir umgehen plattformspezifische Dateien, indem wir die Option --exec-Präfix configure beim Kompilieren von Python setzen.Wie kann ich mit Python Eiern für mehrere Plattformen an einem Ort umgehen?

Mein Problem ist, dass ich jetzt ein Ei mit easy_install (oder anders), die plattformabhängig ist, installieren möchte. easy_install versetzt das Ei in das Verzeichnis site-packages des plattformunabhängigen Teils der Installation. Der Name des Eies hat die Plattform darin, also sollte es keinen Konflikt geben. Aber Python lädt nur den ersten, den es findet. (Unter Solaris könnte es also versuchen, das Linux-Ei zu laden). Das Ändern der easy-install.pth-Datei kann ändern, welche Datei gefunden wird, aber das ist ziemlich nutzlos.

Ich kann die .egg-Dateien in ein plattformabhängiges Paketverzeichnis verschieben und dann pkg_resources.require() verwenden, um sie zu laden (oder den Pfad manuell anzupassen). Aber es scheint, als ob ich nicht müsste, da die Plattform im Namen des Eies ist.

Gibt es eine allgemeinere Möglichkeit, dass ich sicherstellen kann, dass Python das Ei für die richtige Plattform lädt?

+0

Enthält das Ei C-Erweiterungen oder ist es reine Python? – codeape

+0

Ja, es gibt eine C-Erweiterung. Andernfalls wäre das egal, weil der Code nicht plattformabhängig wäre. Insbesondere ist es das PyPerforce-Modul, falls Sie neugierig sind. – Philbert

Antwort

2

Am Ende wurde das plattformabhängige Ei manuell in das plattformspezifische site-packages-Verzeichnis verschoben (wie unter http://docs.python.org/install/index.html angegeben). Dann machte ich eine weitere easy-install.pth im selben Verzeichnis, in der die zu installierenden Eier aufgeführt sind.

Dies wäre viel praktischer, wenn easy_install die exec_prefix zu ehren und Plattform-abhängige Eier in der richtigen "nicht-reine Modulverteilung" Position setzen würde. Vielleicht werde ich dies von den easy_install-Leuten verlangen.

1

Python hat genug Haken, um dies zu ermöglichen, aber es ist wahrscheinlich nicht klug. Wenn Sie dies wirklich implementieren möchten, sehen Sie sich PEP 302 an und beginnen Sie mit dem Hacken auf dem easy_install oder distribute Quellcode. Wie Sie wissen, gibt es in easy-install.pth keine wirkliche Logik.

Sie wären wahrscheinlich viel besser dran, einfach zu verfolgen, welche Python-Pakete Sie installieren möchten. Sie könnten zum Beispiel Ihr eigenes Python-Paket schreiben, das nur von der gewünschten Menge abhängt.

+0

Und/Oder verwenden Sie das Paket python virtualenv, um Ihre Pakete nur für dieses Projekt zu verwalten – RyanWilcox

2

Versuchen Sie, virtualenv ... http://pypi.python.org/pypi/virtualenv ... hilft Ihnen, isolierte Umgebung mit eigenen Python Interpreter + site_packages-Ordner erstellen. Somit haben Sie nie Konflikte mit Paketen, die in einem lokalen Pfad installiert sind.

0

Verwenden Sie "easy_install -m", um alle plattformspezifischen Pakete zu installieren, sodass es keine Standardversion auf sys.path gibt. Auf diese Weise findet die Versionsauflösung zur Laufzeit statt und Plattforminformationen werden berücksichtigt.