2016-05-17 6 views
0

Auf einem Projekt, das ich beteiligt bin, wir Python Produkt verpacken. Die Verzeichnisse von Pyc-Dateien und dergleichen werden gebündelt (tar.gz-Datei) und verteilt. Die Dateinamen werden geändert, um den cpython-34-Teil des Dateinamens zu entfernen.Mit einem pyz enthält pyc Dateien auf einem anderen Rechner

Wir haben eine neue Testumgebung mit Ubuntu 16.04, die 3,5 Python hat und möchte den Code auszuführen/testen. Wenn wir es entpacken und ausführen, erhalten wir einen Fehler:

$ ./configure 
/usr/bin/python3: can't find '__main__' module in '/home/user/product/configure.pyz' 

Wenn ich die pyz Datei manuell entpacken und versuche, den Python von der Kommandozeile ausgeführt werden, um nach dem Import, erhalte ich eine Mitteilung über sie ein Wesen 3.4 binär. Wenn ich stattdessen das Paket auf der Maschine 3.5 bauen, kann ich laufen sie völlig auf dem 3,5-Maschine, aber wenn ich auf 3,4 kopieren, erhalte ich den gleichen Fehler.

Frage ist ... was brauche ich zu laufen zu tun/es testen? Ideen, die ich hatte ... 3.5 in einer Art 3.4 Kompatibilitätsmodus ausgeführt. Installieren Sie 3.4 (wahrscheinlich von der Quelle, weil ich kein 3.4-Paket für Ubuntu 16.04 finden kann). Vielleicht einige 3.5 Konfigurationseinstellungen anpassen? Vielleicht eine neue Einstellung beim Verpacken, damit 3.4 und 3.5 funktionieren können? Ich nehme an, ich habe einige Ideen verpasst, aber ich möchte nicht fragen, was ich denke, die Lösung ist, ich würde gerne wissen, was die Lösung ist.

eine Reihe von SO Fragen im Zusammenhang mit pyc Dateien gegoogelt und gefunden hat, weiß ich, dass die 3.4-Dateien nicht kompatibel sind, aber es gibt Möglichkeiten, es zu benutzen?

Antwort

0

Wie Sie erwähnt haben, sind CPhython-Dateien, die eingehalten werden, nicht unbedingt kompatibel zwischen verschiedenen Versionen und sind plattformabhängig.

kann ich zwei verschiedene Ansätze sehen, und würde eine Lösung für jede vorschlagen:

ändern die Art und Weise Sie die Software verteilen

Wenn Sie so etwas wie ein Python wheel verwenden, um die Software zu verbreiten (dann Anwendung wird auf der Client-Seite als Python-Paket installiert werden), können Sie ein Universalrad bauen, die Version/plattformunabhängig ist. Der Ausgangspunkt Ihrer Anwendung sind Skripts, die vom verteilten Modul installiert werden (die Standardmethode zur Verteilung von Python-Modulen).

Oder Sie können versuchen, die Anwendung als eigenständige ausführbare Datei mit PyInstaller oder cx_Freeze (oder etwas ähnlich) zu bündeln. Auf diese Weise verlassen Sie sich nicht auf die Python-Version der Clients, selbst wenn sie überhaupt eine Python-Version installiert haben. Die Anwendung ist eine eigenständige ausführbare Datei, die auf der entsprechenden Plattform/Architektur ausgeführt wird.

Installieren Sie die gleiche Version von Python auf der Maschine, die Sie möchten, dass Ihre Anwendung

Dies ist immer viel einfacher, in diesen Tagen mit Hilfe von Containern (wie Docker) laufen zu lassen. Oder Sie bevorzugen es, es aus der Quelle zu erstellen, wenn Sie Probleme mit Docker haben. Aber docker verwendet, ist einfach:

docker pull python:3.4 
docker run --rm -it -v $(pwd):/code -w /code python:3.4 python app.pyz 

Die Linie, die Python Container läuft möglicherweise weitere Einstellungen für Ihre Anwendung/Konfiguration benötigen, aber in der Regel ist das gut genug.