runpy
— Lokalisering och exekvering av Python-moduler¶
Källkod: Lib/runpy.py
Modulen runpy
används för att hitta och köra Python-moduler utan att importera dem först. Den används huvudsakligen för att implementera kommandoradsalternativet -m
som gör att skript kan lokaliseras med hjälp av Python-modulens namnrymd i stället för filsystemet.
Observera att detta inte är en sandlådemodul - all kod exekveras i den aktuella processen och eventuella sidoeffekter (t.ex. cachad import av andra moduler) kommer att finnas kvar efter att funktionerna har returnerats.
Dessutom är det inte garanterat att funktioner och klasser som definieras av den exekverade koden fungerar korrekt efter att en runpy
-funktion har returnerats. Om denna begränsning inte är acceptabel för ett visst användningsfall, är importlib
sannolikt ett lämpligare val än denna modul.
Modulen runpy
innehåller två funktioner:
- runpy.run_module(mod_name, init_globals=None, run_name=None, alter_sys=False)¶
Exekverar koden för den angivna modulen och returnerar den resulterande modulens globals-ordbok. Modulens kod lokaliseras först med hjälp av standardimportmekanismen (se PEP 302 för detaljer) och exekveras sedan i ett nytt modulnamnrymd.
Argumentet mod_name bör vara ett absolut modulnamn. Om modulnamnet hänvisar till ett paket i stället för en vanlig modul importeras paketet och undermodulen
__main__
i paketet exekveras och den resulterande modulens globala ordbok returneras.Det valfria ordboksargumentet init_globals kan användas för att fylla på modulens globala ordbok innan koden exekveras. init_globals kommer inte att modifieras. Om någon av de speciella globala variablerna nedan är definierade i init_globals, åsidosätts dessa definitioner av
run_module()
.De speciella globala variablerna
__name__
,__spec__
,__file__
,__cached__
,__loader__
och__package__
sätts i globals-ordlistan innan modulkoden exekveras. (Observera att detta är en minimal uppsättning variabler - andra variabler kan ställas in implicit som en implementationsdetalj för tolken)__name__
sätts till run_name om detta valfria argument inte ärNone
, tillmod_name + '.__main__'
om den namngivna modulen är ett paket och till argumentet mod_name i annat fall.__spec__
kommer att ställas in på lämpligt sätt för den verkligen importerade modulen (dvs.__spec__.name
kommer alltid att vara mod_name ellermod_name + '.__main__'
, aldrig run_name).__file__
,__cached__
,__loader__
och__package__
är inställda som normala baserat på modulspecifikationen.Om argumentet alter_sys anges och utvärderas till
True
, uppdaterassys.argv[0]
med värdet för__file__
ochsys.modules[__name__]
uppdateras med ett temporärt modulobjekt för den modul som körs. Bådesys.argv[0]
ochsys.modules[__name__]
återställs till sina ursprungliga värden innan funktionen returneras.Observera att denna manipulation av
sys
inte är trådsäker. Andra trådar kan se den delvis initialiserade modulen, liksom den ändrade listan med argument. Det rekommenderas attsys
-modulen lämnas ifred när denna funktion anropas från trådad kod.Se även
Alternativet
-m
erbjuder motsvarande funktionalitet från kommandoraden.Ändrad i version 3.1: Lagt till möjligheten att exekvera paket genom att leta efter en
__main__
-undermodul.Ändrad i version 3.2: Lagt till den globala variabeln
__cached__
(se PEP 3147).Ändrad i version 3.4: Uppdaterad för att dra nytta av modulspecifikationsfunktionen som lagts till av PEP 451. Detta gör att
__cached__
kan ställas in korrekt för moduler som körs på detta sätt, samt att det verkliga modulnamnet alltid är tillgängligt som__spec__.name
.Ändrad i version 3.12: Inställningen av
__cached__
,__loader__
och__package__
är föråldrad. SeModuleSpec
för alternativ.
- runpy.run_path(path_name, init_globals=None, run_name=None)¶
Exekvera koden på den angivna platsen i filsystemet och returnera den resulterande modulens globals-ordbok. Precis som med ett skriptnamn som anges på CPythons kommandorad kan file_path hänvisa till en Python-källfil, en kompilerad bytecode-fil eller en giltig
sys.path
-post som innehåller en__main__
-modul (t.ex. en zip-fil som innehåller en__main__.py
-fil på toppnivå).För ett enkelt skript exekveras den angivna koden helt enkelt i ett nytt modulnamnrymd. För en giltig
sys.path
-post (vanligtvis en zip-fil eller katalog) läggs posten först till i början avsys.path
. Funktionen söker sedan efter och exekverar en__main__
-modul med den uppdaterade sökvägen. Observera att det inte finns något särskilt skydd mot att anropa en befintlig__main__
-post som finns någon annanstans påsys.path
om det inte finns någon sådan modul på den angivna platsen.Det valfria ordboksargumentet init_globals kan användas för att fylla på modulens globala ordbok innan koden exekveras. init_globals kommer inte att modifieras. Om någon av de speciella globala variablerna nedan är definierade i init_globals, åsidosätts dessa definitioner av
run_path()
.De speciella globala variablerna
__name__
,__spec__
,__file__
,__cached__
,__loader__
och__package__
sätts i globals-ordlistan innan modulkoden exekveras. (Observera att detta är en minimal uppsättning variabler - andra variabler kan ställas in implicit som en implementationsdetalj för tolken)__name__
sätts till run_name om detta valfria argument inte ärNone
och till'<run_path>'
annars.Om file_path direkt refererar till en skriptfil (antingen som källkod eller som förkompilerad bytekod), kommer
__file__
att sättas till file_path, och__spec__
,__cached__
,__loader__
och__package__
kommer alla att sättas tillNone
.Om file_path är en referens till en giltig
sys.path
-post kommer__spec__
att ställas in på lämpligt sätt för den importerade__main__
-modulen (det vill säga__spec__.name
kommer alltid att vara__main__
).__file__
,__cached__
,__loader__
ochpackage__
kommer att ställas in som vanligt baserat på modulspecifikationen.Ett antal ändringar görs också i modulen
sys
. För det första kansys.path
ändras enligt beskrivningen ovan.sys.argv[0]
uppdateras med värdet för file_path ochsys.modules[__name__]
uppdateras med ett temporärt modulobjekt för den modul som exekveras. Alla ändringar av objekt isys
återställs innan funktionen returneras.Observera att till skillnad från
run_module()
är ändringarna isys
inte valfria i denna funktion eftersom dessa justeringar är nödvändiga för att möjliggöra exekvering avsys.path
-poster. Eftersom begränsningarna för trådsäkerhet fortfarande gäller, bör användning av denna funktion i trådad kod antingen serialiseras med importlåset eller delegeras till en separat process.Se även
Alternativ för gränssnitt för motsvarande funktionalitet på kommandoraden (
python path/to/script
).Tillagd i version 3.2.
Ändrad i version 3.4: Uppdaterad för att dra nytta av funktionen modulspecifikation som lagts till av PEP 451. Detta gör att
__cached__
kan ställas in korrekt i de fall där__main__
importeras från en giltigsys.path
-post istället för att exekveras direkt.Ändrad i version 3.12: Inställningen av
__cached__
,__loader__
och__package__
är föråldrad.
Se även
- PEP 338 – Exekvera moduler som skript
PEP skrivet och genomfört av Nick Coghlan.
- PEP 366 – Huvudmodulens explicita relativa import
PEP skrivet och genomfört av Nick Coghlan.
- PEP 451 – En ModuleSpec-typ för importsystemet
PEP skrivet och implementerat av Eric Snow
Kommandorad och miljö - CPython-kommandoradsdetaljer
Funktionen importlib.import_module()