[python] file.close

zu1234 zu1234 na seznam.cz
Středa Květen 2 15:33:12 CEST 2012


Děkuji za konstruktivní odpověď.

1) Opravdu mi na jednom místě u close chyběly závorky :-)

2) Postup pomocí atexit jsem použil podle zvyku z bash-e.
Ale python nezavírá soubory před atexit funkcí, jak jsem se mylně domníval.

3) Přepsal jsem to na 'with open(...) as ...'
	nebo 'try ... finally ...' pro zipfile.ZipFile

4) Knihovnu tempfile používám, ale ta sama nic nemaže. A právě při 
rušení dočasného adresáře jsem se dostal do problémů.

5) Nakonec jsem musel před rušením dočasného adresáře ponechat
time.sleep(1). Jinak nastávala chyba: adresář není prázdný

Díky,
ZU

Dne 27.4.2012 16:51, Hynek Fabian napsal(a):
> IMO python sám pozavírá otevřené soubory když garbage collector dělá
> úklid a zavolá destruktory osiřelým file instancím.
> Se zámky ti neporadím, to je wydláčtina :-) ale pokud chceš mít 100%
> jistotu že nic nezůstane, můžeš aplikovat "NKVD algoritmus" neboli
> zavřít pro jistotu všechny bez rozdílu:
>
> for fd in range(0, os.sysconf_names.get("SC_OPEN_MAX", 1024)):
>      try:
>          os.close(fd)
>      except OSError, ex:
>          pass
>
> Ovšem to bych použil jen v krajním případě, protože přijdeš i o stdout.
> V každém případě bych se vyhnul hackům jako je atexit,
> uklidit po sobě můžeš už v handleru výjimky, resp. ve finally bloku.
> Pokud se chceš vyhnout opisování stále stejného bloku výjimky,
> použij context manager. Jednoduchá varianta je ve file objektu už
> zabudovaná:
>
> with open("spam", "w") as f:
>      f.write("ham")
>      ...
>
> Zavření je takto automatické, i když vystřelí výjimka.
> Napsat si vlastní kontext který soubor i smaže je trivka,
> viz r.t.f.m. :-)
>
> btw na dočasné soubory máme krásnou knihovnu tempfile.
>


Další informace o konferenci Python