Modul importieren, benutzen, dann Modul-Datei löschen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
windner
User
Beiträge: 76
Registriert: Freitag 19. Oktober 2007, 11:25

Donnerstag 1. November 2007, 16:35

Ich habe ein Problem:

Ich möchte ein Modul importieren, verwenden, und wenn alles fertig ist, die Modul-Datei löschen (weil ich sie nur temporär erstellt habe). Man kann aber die Modul-Datei nicht löschen, wenn man sie einmal importiert hat, weil da scheinbar ein File-Lock aufrechterhalten wird (ich verwende Windows).

Zur Erläuterung:

Code: Alles auswählen

>>>from __future__ import with_statement
>>>import imp
>>>with open(r'c:\tempmod.pyd','r') as fp:
    mod = imp.load_module('tempmod',
        fp,
        r'c:\tempmod.pyd',
        ('.pyd', 'rb', imp.C_EXTENSION))
# jetzt kann ich über den Namen "mod" auf das Modul zugreifen
>>>dir(mod)
['__doc__', '__file__', '__name__', 'function']  # (mehr ist nicht dran)
>>>mod.function()
42
Jetzt möchte ich, weil ich fertig bin, die temporäre Modul-Datei (c:\tempmod.py) löschen:

Code: Alles auswählen

>>>import os; os.unlink(r'c:\tempmod.pyd')

Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    os.unlink('c:\\tempmod.pyd')
WindowsError: [Error 13] Zugriff verweigert: 'c:\\tempmod.pyd'
#geht nicht, also versuche ich, das Modul zu löschen
>>>del mod; import gc; gc.collect()
0
>>>os.unlink(r'c:\tempmod.pyd')

Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    os.unlink('c:\\tempmod.pyd')
WindowsError: [Error 13] Zugriff verweigert: 'c:\\tempmod.pyd'
#geht noch immer nicht
Es gibt kein "unimport"-Statement, auch in "imp" finde ich keine Funktion, die das machen würde. Ich kann das Modul-File erst löschen, nachdem ich die interaktive Sitzung beendet habe, was unbefriedigend ist, weil ich am Ende meiner Scripts das tempöre Modul einfach wieder löschen will.

Wie macht man das?
ionut.bizau
User
Beiträge: 1
Registriert: Mittwoch 28. November 2007, 04:09
Wohnort: Beijing, China
Kontaktdaten:

Mittwoch 28. November 2007, 10:16

Eimal aufgeladen kannst du ein Modul nicht mehr ausladen.
Aber ich glaube du kannst das folgende machen:
1) lies das Inhalt der Modul-Datei in einen string
2) eval(compile(module_content, 'some_name', 'exec'))
3) jetzt kannst du die Datei löschen
http://ionut.bizau.ro/
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 28. November 2007, 10:44

Ich glaube mich erinnern zu können, dass so ein ähnliches Problem schon mal gefragt wurde (da ging es glaube ich darum, Module aus dem Internet zu laden und zu importieren). Allerdings kann ich ihn grade nicht finden, vielleicht hast du ja mehr Glück.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten