Frage

Ich bin ein py2exe-kompilierten Python-Programm von einem Server-Rechner auf einer Reihe von Client-Rechnern (abgebildet auf ein Netzlaufwerk auf jeder Maschine ausgeführt wird, sagen W :).

Für Windows XP und später Maschinen haben so hatte weit Null Probleme mit Python Aufnehmen W: \ python23.dll (ja, ich bin mit Python 2.3.5 für W98 Kompatibilität und das alles). Es wird dann W verwenden: \ zlib.pyd W dekomprimieren. \ Library.zip enthält alle .pyc Dateien wie os und solche, die dann importiert werden, und das Programm läuft keine Probleme

Die Frage, die ich bin immer auf einigen Windows 98 SE-Maschinen (Hinweis: Einige Windows 98 SE-Maschinen, andere scheinen ohne offensichtliche Probleme zu arbeiten). Was passiert ist, läuft das Programm von W :, W: \ python23.dll ist, gehe ich davon aus, fand (da ich Python ImportErrors immer, wir müssten in der Lage sein, eine Python-Import-Anweisung auszuführen), sondern ein paar Dinge nicht funktionieren:

1) Wenn W: \ library.zip enthält die einzige Kopie der .pyc Dateien, erhalte ich ZipImportError: can't decompress data; zlib not available (Unsinn, wenn man bedenkt W: \ zlib.pyd ist verfügbar und funktioniert gut mit dem XP und höher Maschinen auf dem gleichen Netzwerk).

2) Wenn die .pyc Dateien werden in der Python-exe von py2exe tatsächlich gebündelt oder im selben Verzeichnis wie die EXE setzen, oder ein Unterverzeichnis namens setzen, in denen dann als Teil der PYTHONPATH Variable gesetzt ist (zB W :. \ pylib), erhalte ich ImportError: no module named os (o ist das erste Modul importiert, vor sys und irgendetwas anderes)

Kommen Sie, daran zu denken, sys.path nicht zur Verfügung stehen würde zu suchen, wenn os, bevor es vielleicht importiert wurden? Ich werde versuchen, die Reihenfolge dieser Einfuhren Schalt aber meine Frage steht immer noch: Warum ist das ein Problem sporadisch auf einigen Netzwerken zu arbeiten, aber nicht auf andere? Und wie würde ich Python zwingen, die Dateien zu finden, die ich laufe in den sehr ausführbaren gebündelt werden? Ich habe sofort Zugriff auf die Arbeits Windows 98 SE-Maschine, aber ich nur Zugriff auf die nicht arbeit ein (ein Kunde von mir) jeden Morgen vor ihrem Laden öffnet.

Vielen Dank im Voraus!


EDIT: Okay, großer Schritt nach vorn. Nach dem Debuggen mit PY2EXE_VERBOSE, ist das Problem auf der spezifischen W98SE Maschine auftritt, dass es die richtige Pfadsyntax nicht ist zu verwenden, wenn für die Einfuhr suchen. Erstens ist es nicht die Umgebungsvariable PYTHONPATH (es kann sein, ein py2exe-spezifisch Ich bin mir nicht bewusst, wie PY2EXE_VERBOSE).

scheint zu lesen

Zum anderen sieht es nur an einer Stelle, bevor er aufgibt (wenn die Dateien im EXE gebündelt werden, ist es dort aussieht. Wenn nicht, ist es in library.zip aussieht).

EDIT 2 : In der Tat, nach this , gibt es einen Unterschied zwischen der sys.path im Python-Interpreter und die Py2exe ausführbaren Dateien. Insbesondere sys.path contains only a single entry: the full pathname of the shared code archive. bla. Keine Fallbacks? Nicht einmal das aktuelle Arbeitsverzeichnis? Ich würde versuchen, W:\ zu PATH hinzufügen, aber py2exe entsprechen nicht jede Art von Standards für Systembibliotheken Ortung, so wird es nicht funktionieren.

Jetzt für das interessante Bit. Der Weg versucht es atexit zu laden, os usw. stammt von:

  

W:\\library.zip\<module>.<ext>

Beachten Sie die einzelnen Schrägstrich nach library.zip, aber die doppelten Schrägstrich nach dem Laufwerksbuchstaben (jemand mich korrigieren, wenn dies beabsichtigt ist, und sollte funktionieren). Es sieht aus wie wenn dies einen Zeichenfolgenliteral ist, dann wird, da der Schrägstrich nicht verdoppelt wird, ist es als (ungültig) Escape-Sequenz gelesen hat und das rohe Zeichen gedruckt wird (W:\library.zipos.pyd, W:\library.zipos.dll, ... statt mit einem Schrägstrich geben); Wenn es nicht ein Stringliteral, der doppelte Schrägstrich ist möglicherweise nicht automatisch normpath'd wird (wie es sein soll) und so der doppelte Schrägstrich verwirrt die Modul-Lader. Wie ich schon sagte, kann ich nicht nur set PYTHONPATH=W:\\library.zip\\ weil sie ignoriert diese Variable.

Es kann sich lohnen, sys.path.append zu Beginn meines Programms verwenden, aber hart codierte Modulpfade ist eine absolute Notlösung, zumal das Problem in einer Konfiguration einer veralteten OS auftritt.

Einy Ideen? Ich habe eine, die die sys.path Normpath ist .. schade, ich brauche os dafür. Ein weiterer Grund ist nur os.getenv('PATH') oder os.getenv('PYTHONPATH') zu sys.path anhängen ... wieder, um das os Modul. Das site Modul ausfällt auch zu initialisieren, so kann ich nicht eine .pth Datei verwenden.

Ich habe versucht, auch vor kurzem den folgenden Code am Anfang des Programms:

for pth in sys.path:
    fErr.write(pth)
    fErr.write(' to ')
    pth.replace('\\\\','\\') # Fix Windows 98 pathing issues
    fErr.write(pth)
    fErr.write('\n')

Aber es kann nicht geladen werden linecache.pyc, oder irgendetwas anderes für diese Angelegenheit; es kann nicht tatsächlich die Befehle von den Blicken der Dinge auszuführen. Gibt es eine Möglichkeit eine integrierte Funktionalität zu verwenden, die nicht linecache braucht die sys.path dynamisch zu ändern? Oder bin ich zu hart codierte die richtige sys.path reduziert?

War es hilfreich?

Lösung 2

Das Problem ist nicht mehr ein Problem für mich, fand ich eine alternative Lösung (die meine Arbeit dort kann oder nicht beteiligt verlassen). Akzeptieren Sie diese Antwort, bis jemand anderes kann eine zufriedenstellende Lösung bieten.

Andere Tipps

Dies ist keine direkte Antwort, aber vielleicht etwas Hilfe. Sind Sie mit der -v Option in Python vertraut. Geben Sie python -h mehr zu erfahren. Beachten Sie die äquivalent zu der PYTHONVERBOSE Umgebungsvariable für py2exe'd Skripte ist PY2EXE_VERBOSE, wie fast nirgends beschrieben, außer in dieser Beitrag durch den Autor . Offenbar kann es Wert von 1 oder 2 nehmen, im Grunde wie -v und -vv, obwohl das von wie PYTHONVERBOSE funktioniert .

Beachten Sie auch über Ihre sys.path Idee: Ob sys bereits importiert haben oder nicht würde auf keinen Einfluss haben, ob Sie os importieren könnte. Das heißt, der Python-Pfad (sichtbar in sys.path) steht immer zur Verfügung, in dem Sinne, dass es eine interne Funktion des Interpreters widerspiegelt, die es gibt, ob Sie das Modul sys oder nicht importiert haben.

Wie bei einer Reihe von anderen Modulen, sys ist eingebaut, so sollte es immer importierbar sein, auch wenn Ihre Anwendung ist fast völlig gelähmt. Wenn es hilft, können Sie in der Lage sein sys.builtin_module_names zu verwenden, um zu sehen, was sie für Ihre Version von Python sind. Wenn der Dolmetscher überhaupt ausgeführt würde, dass die Informationen zur Verfügung, so kann folgendes die kleinste nützliches Programm sein kann, um zu sehen, was du hast:

import sys
print sys.builtin_module_names

Außerdem würde ich davon abraten, alles versuchen, Phantasie wie die .pyc Dateien im EXE zu bündeln. Du hast bereits genug Arbeits bekam gegen Sie Win98 unterstützt stecken, und wenn ich Sie wäre, würde ich für die einfachste Lösung gehen, die mir den Job bekommen würde lassen getan und ziehen weiter, um mehr interessante Gebiete. Wenn Sie nur Python normalerweise installieren könnten und von der Quelle ausführen, sollten Sie es auf jeden Fall berücksichtigen! :)

Edited enthalten Link Info pro Kommentar PY2EXE_VERBOSE von darvids0n.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top