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.
windner
User
Beiträge: 76
Registriert: Freitag 19. Oktober 2007, 11:25

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

Beitragvon windner » 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:

Beitragvon ionut.bizau » 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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » 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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder