atexit — Exit-hanterare


Modulen atexit definierar funktioner för att registrera och avregistrera rensningsfunktioner. Funktioner som registrerats på detta sätt körs automatiskt vid normal avslutning av tolken. atexit kör dessa funktioner i omvänd ordning som de registrerades i; om du registrerar A, B och C kommer de vid avslutning av tolken att köras i ordningen C, B, A.

Observera: De funktioner som registreras via denna modul anropas inte när programmet dödas av en signal som inte hanteras av Python, när ett fatalt internt fel i Python upptäcks eller när os._exit() anropas.

Note: Effekten av att registrera eller avregistrera funktioner inom en rensningsfunktion är odefinierad.

Ändrad i version 3.7: När de används med C-API-undertolkar är registrerade funktioner lokala för den tolk de registrerades i.

atexit.register(func, *args, **kwargs)

Registrera func som en funktion som ska exekveras vid avslutning. Eventuella valfria argument som ska skickas till func måste skickas som argument till register(). Det är möjligt att registrera samma funktion och argument mer än en gång.

Vid normal programavslutning (t.ex. om sys.exit() anropas eller om huvudmodulens exekvering avslutas) anropas alla registrerade funktioner i ordningen sist in, först ut. Antagandet är att moduler på lägre nivå normalt kommer att importeras före moduler på högre nivå och därför måste rensas upp senare.

Om ett undantag uppstår under exekveringen av exit-hanterarna skrivs en spårning ut (såvida inte SystemExit uppstår) och informationen om undantaget sparas. När alla exit-hanterare har haft en chans att köras, aktiveras det sista undantaget som aktiverades på nytt.

Denna funktion returnerar func, vilket gör det möjligt att använda den som en dekorator.

Varning

Att starta nya trådar eller anropa os.fork() från en registrerad funktion kan leda till tävlingsförhållanden mellan Pythons huvudtråd som frigör trådtillstånd medan interna threading-rutiner eller den nya processen försöker använda det tillståndet. Detta kan leda till krascher snarare än ren avstängning.

Ändrad i version 3.12: Försök att starta en ny tråd eller os.fork() en ny process i en registrerad funktion leder nu till RuntimeError.

atexit.unregister(func)

Ta bort func från listan över funktioner som ska köras när tolken stängs av. unregister() gör ingenting om func inte registrerats tidigare. Om func har registrerats mer än en gång kommer varje förekomst av den funktionen i anropsstacken atexit att tas bort. Jämlikhetsjämförelser (==) används internt under avregistreringen, så funktionsreferenser behöver inte ha matchande identiteter.

Se även

Modul readline

Användbart exempel på atexit för att läsa och skriva readline historikfiler.

atexit Exempel

Följande enkla exempel visar hur en modul kan initiera en räknare från en fil när den importeras och spara räknarens uppdaterade värde automatiskt när programmet avslutas utan att vara beroende av att programmet gör ett uttryckligt anrop till denna modul vid avslutningen.

try:
    with open('counterfile') as infile:
        _count = int(infile.read())
except FileNotFoundError:
    _count = 0

def incrcounter(n):
    global _count
    _count = _count + n

def savecounter():
    with open('counterfile', 'w') as outfile:
        outfile.write('%d' % _count)

import atexit

atexit.register(savecounter)

Positionella argument och nyckelordsargument kan också skickas till register() för att skickas vidare till den registrerade funktionen när den anropas:

def goodbye(name, adjective):
    print('Goodbye %s, it was %s to meet you.' % (name, adjective))

import atexit

atexit.register(goodbye, 'Donny', 'nice')
# or:
atexit.register(goodbye, adjective='nice', name='Donny')

Användning som decorator:

import atexit

@atexit.register
def goodbye():
    print('You are now leaving the Python sector.')

Detta fungerar endast med funktioner som kan anropas utan argument.