[python] file.close

Hynek Fabian hynek.fabian na firma.seznam.cz
Pátek Duben 27 16:51:44 CEST 2012


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.


On 04/27/12 16:14, zu1234 wrote:
> To snad není pravda!?!
> Už jsem doma, takže se nemohu podívat do zdroje,
> ale myslím že máte pravdu!
> 
> Nicméně: domnívám se že Python sám po sys.exit() uzavře
> všechny otevřené soubory a tak uvolní zámky, které by
> bránili jejich smazání ve funkci pověšené na atexit.
> 
> Ale proč tedy (oper. systém) ječí "Proces nemá
> přístup k souboru neboť jej využívá jiný proces:"?
> 
> Myslím že problém je v tom že uvolnění zámků trvá windows-ům
> nějakou chvíli a požadavek na smazání přijde příliš rychle.
> 
> Použil jsem time.sleep(5) před mazání a problémy se zámky
> se ztratili.
> 
> Nebo máte lepší nápad?
> 
> Příští týden budu pokračovat.
> Pro tento týden děkuji za reakce!
> 
> ZU
> 
> 
> Dne 27.4.2012 14:43, Hynek Fabian napsal(a):
>>>> try:
>>>>      FI.write(PART)
>>>> except:
>>>>      FI.close
>>>
>>> chybejici zavorky jsou predpokladam jenom chyba v emailu?
>>
>> To nepredpokladej. :-) Bez zavorek je to platny pythoni vyraz, ktery
>> ovsem nic nezavre.
>> _______________________________________________
>> Python mailing list
>> Python na py.cz
>> http://www.py.cz/mailman/listinfo/python
>>
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python



Další informace o konferenci Python