Seite 1 von 1

File open close - nach exec

Verfasst: Mittwoch 5. Oktober 2011, 13:12
von api
Hallo zusammen,

ich lese mit meinem Prg Variablenwerte zur Laufzeit ein. Dieses mache ich mit dem Kommando:

Code: Alles auswählen

exec(compile(open(CONFIG_FILE).read(), CONFIG_FILE, 'exec'))
In dieser Datei (CONFIG_FILE) stehen zB Variablen, wie:

a = 1
b = 2

Unter Python 2.7 lief alles ohne Probleme. Jetzt unter 3.2 läuft es auch, aber ich bekomme immer folgende Warnung:

Code: Alles auswählen

ftpinter3:112: ResourceWarning: unclosed file <_io.TextIOWrapper name='/app/etc/ftpinter3.cfg' mode='r' encoding='UTF-8'>
  exec(compile(open(CONFIG_FILE).read(), CONFIG_FILE, 'exec'))
Meine Fragen nun:
  • - Wie kann man diese Datei wieder schließen? Ich habe ja keinen Handler.
    - Oder könnte man einfach die Warnung abschalten? (Wäre natürlich nicht gerade sauber)
CU,
api

Re: File open close - nach exec

Verfasst: Mittwoch 5. Oktober 2011, 13:25
von deets
Mir ist ein bisschen schummerig, nachdem ich das gelesen habe. Das du durch dieses Configurations-einlesen eine Scheunentor-grosse Sicherheitsluecke eingebaut hast, ist dir hoffentlich bewusst? Und das es auch auesserst schlecht zu verstehen und debuggen ist?

Es waere *wesentlich* besser, wenn du einfach eine ini-style Konfigurationsdatei einlesen wuerdest, und auf deren Werte dann wie in einem dictionary zugreifst.

Zu deinem Problem: nichts hindert dich doch daran, aus deinem Statement etwas zu machen ala

Code: Alles auswählen

with open(CONFIG_FILE) as inf:
        exec(compile(inf.read()))
Aber, nochmal: am besten vergisst du, dass exec existiert. Ich programmiere jetzt seit 13 Jahren Python, und ich habe es nicht einmal verwenden muessen.

Re: File open close - nach exec

Verfasst: Mittwoch 5. Oktober 2011, 14:27
von api
Hi deets,

schonmal vorab: DANKE !!! Genau das wollte ich wissen... :D
(es ist manchmal so einfach...)

Sicherlich hätte ich damals das nicht per "exec" lösen sollen. Was allerdings den Sicherheitsaspekt angeht, so wäre ich das einzige Risiko, da sonst niemand an diese Datei rankommt. Aber "exec" braucht man wirklich nicht - da hast du vollkommen recht...

Da gibt es bessere Möglichkeiten - wahrscheinlich wird es demnächst in XML abgebildet oder als "ini"-Datei...


CU,
api