3 Stimmen

Parameterisierung einer Importanweisung

Ich pflege ein Python-Modul, das die Funktionalität einer DLL umhüllt und freigibt (die ebenfalls von mir gepflegt wird). Die Interaktion mit der DLL erfolgt über ctypes.

All dies funktioniert wunderbar, dank der Wunder von ctypes. Allerdings bin ich bei weitem kein Python-Experte, daher gibt es einige Teile des Python-Codes, die mir nicht idomatisch erscheinen.

Insbesondere biete ich dem Benutzer des Moduls die Kontrolle über den Speicherort der DLL an. Die DLL wird beim Import des Moduls geladen. Ich mache das, weil ich das Verhalten basierend auf der Funktionalität der DLL ändern möchte und die DLL laden muss, um ihr Verhalten abzufragen.

Standardmäßig greift der DLL-Import auf den DLL-Suchpfad zurück, um die DLL zu lokalisieren. Ich würde es jedoch gerne ermöglichen, dass der Benutzer bei Bedarf den vollständigen Pfad zur DLL angeben kann, um eine bestimmte Version auszuwählen.

Derzeit mache ich das, indem ich eine Umgebungsvariable verwende, aber ich erkenne, dass dies eine ziemlich groteske Art ist, es zu tun. Ich suche nach einem kanonischen oder idomatischen Python-Weg, damit der Modul-Importer Informationen an das Modul übergeben kann, die zum Zeitpunkt des Modulimports abgerufen werden können.

5voto

Martin v. Löwis Punkte 120025

Sie sollten das Laden der DLL auf den Zeitpunkt verschieben, an dem sie tatsächlich zum ersten Mal verwendet wird, und eine optionale Funktion initialize anbieten:

_initialisiert=False
def initialize(path=None):
  if _initialisiert:
    if path:
      raise ValueError, "initialize aufgerufen nach erster Verwendung"
    return
  if path is None:
    path = standard_pfad
  dll_laden(path)
  funktionen_bestimmen()

Rufen Sie dann initialize() in allen von Ihnen angebotenen APIs auf. Dadurch erhält der Benutzer die Möglichkeit, sie zu überschreiben, aber wenn er dies nicht tut, wird sie weiterhin wie bisher funktionieren (Sie können sogar die Unterstützung für die Umgebungsvariable beibehalten).

Wenn Sie bereit sind, die API zu ändern, verwenden Sie Klassen:

class DLLAPI:
  def __init__(self, path=None):
    ...

Benutzer müssten eine DLLAPI-Instanz erstellen und möglicherweise einen DLL-Pfad übergeben oder nicht übergeben. Auf diese Weise kann sogar gleichzeitig unterschiedliche DLLs verwendet werden.

1voto

Xavier Barbosa Punkte 3769

Dieser Code stammt von dieser Seite http://code.google.com/p/modwsgi/wiki/VirtualEnvironments Es fügt einige Pfade zum Erkunden hinzu:

ALLDIRS = ['usr/local/pythonenv/PYLONS-1/lib/python2.5/site-packages']

import sys 
import site 

# Ursprünglichen sys.path merken.
prev_sys_path = list(sys.path) 

# Füge jeden neuen site-packages-Verzeichnis hinzu.
for directory in ALLDIRS:
  site.addsitedir(directory)

# sys.path neu anordnen, damit neue Verzeichnisse am Anfang stehen.
new_sys_path = [] 
for item in list(sys.path): 
    if item not in prev_sys_path: 
        new_sys_path.append(item) 
        sys.path.remove(item) 
sys.path[:0] = new_sys_path

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X