2008-11-20 14 views
5

Wie erstellt man eine gute Plugin-Engine für eigenständige ausführbare Dateien, die mit pyInstaller, py2exe oder ähnlichen Tools erstellt wurden?Erstellen von Plugins für eigenständige Python-Executables

Ich habe keine Erfahrung mit py2exe, aber pyInstaller verwendet einen Import-Hook, um Pakete aus seinem komprimierten Repository zu importieren. Natürlich kann ich auch ein anderes komprimiertes Repository, das mit pyInstaller erstellt wurde, dynamisch importieren und den Code ausführen - dies kann eine einfache Plugin-Engine sein.

Probleme treten auf, wenn das Plugin (das was dynamisch importiert wird) eine Bibliothek verwendet, die nicht im Originalrepository vorhanden ist (nie importiert). Dies liegt daran, dass der Import-Hook für die ursprüngliche Anwendung ist und nach Paketen im Original-Repository sucht - nicht nach dem, das später importiert wird (Plugin-Paket-Repository).

Gibt es eine einfache Möglichkeit, dieses Problem zu lösen? Vielleicht gibt es einen solchen Motor?

Antwort

3

Beim Kompilieren zu exe, wird dieses Problem auftreten.

Die einzige Option, die ich mir vorstellen kann, Benutzern den Zugriff auf ihre Plugins zu ermöglichen, ist die Einbindung aller Bibliotheken in das exe-Paket.

Es ist wahrscheinlich eine gute Idee, unterstützte Bibliotheken auf eine Teilmenge zu beschränken und sie in Ihrer Dokumentation aufzuführen. Wie du willst.

Ich habe nur py2exe verwendet.

In py2exe können Sie Bibliotheken angeben, die nicht in der Suche in der setup.py Datei gefunden wurden.

Hier ist ein Beispiel:.

from distutils.core import setup 
import py2exe 

setup (name = "script2compile", 
     console=['script2compile.pyw'], 
     version = "1.4", 
     author = "me", 
     author_email="[email protected]", 
     url="myurl.com", 
     windows = [{ 
        "script":"script2compile.pyw", 
        "icon_resources":[(1,"./ICONS/app.ico")] # Icon file to use for display 
       }], 
     # put packages/libraries to include in the "packages" list 
     options = {"py2exe":{"packages": [ "pickle", 
              "csv", 
              "Tkconstants", 
              "Tkinter", 
              "tkFileDialog", 
              "pyexpat", 
              "xml.dom.minidom", 
              "win32pdh", 
              "win32pdhutil", 
              "win32api", 
              "win32con", 
              "subprocess", 
             ]}} 

     ) 

import win32pdh 
import win32pdhutil 
import win32api 
1

PyInstaller tut ein Plugin-System für den Umgang mit versteckten Importe haben, und Schiffe mit mehreren derjenigen, die bereits in die Webseite anzeigen (http://www.pyinstaller.org), die sagt:

Das Hauptziel von PyInstaller ist es, mit den 3rd-Party-Paketen kompatibel zu sein. Dies bedeutet, dass mit PyInstaller alle erforderlichen Tricks, um externe Pakete arbeiten zu lassen, bereits in PyInstaller selbst integriert sind, so dass kein Benutzereingriff erforderlich ist. Sie müssen nie nach Tricks in Wikis suchen und benutzerdefinierte Änderungen an Ihren Dateien oder Setup-Skripten vornehmen. Überprüfen Sie unsere Kompatibilitätsliste von SupportedPackages.

+0

Ich dachte über Plugin-System für meine eigenständige Anwendung nach. Ich habe eine Anwendung mit pyInstaller erstellt. Ich möchte Plugins für diese Anwendung erstellen. Das Problem ist, wenn das Plugin etwas importiert, das nicht in die ursprüngliche Anwendung importiert wurde - der Import schlägt fehl. – uhz

+0

Also am besten wäre, wenn: - Plugins enthalten keine Module, die bereits in binäre Anwendung sind - Plugins enthalten Module, die nicht in der Anwendung vorhanden sind - importiert zuerst versucht, aus der Hauptanwendung zu importieren, wenn von Plugin-Modulen – uhz

+0

Genau das macht PyInstaller. Hast du es versucht? –