Seite 1 von 1

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

Verfasst: Donnerstag 1. November 2007, 16:35
von windner
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?

Verfasst: Mittwoch 28. November 2007, 10:16
von ionut.bizau
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

Verfasst: Mittwoch 28. November 2007, 10:44
von Leonidas
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.