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 internathreading
-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 tillRuntimeError
.
- 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 anropsstackenatexit
att tas bort. Jämlikhetsjämförelser (==
) används internt under avregistreringen, så funktionsreferenser behöver inte ha matchande identiteter.
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.