IDLE — Python-redigerare och skal¶
Källkod: Lib/idlelib/
IDLE är Pythons integrerade utvecklings- och inlärningsmiljö.
IDLE har följande egenskaper:
plattformsoberoende: fungerar i stort sett på samma sätt i Windows, Unix och macOS
Python-skalfönster (interaktiv tolk) med färgläggning av kodinmatning, kodutmatning och felmeddelanden
textredigerare med flera fönster, flera ångra, Python-färg, smart indrag, anropstips, automatisk komplettering och andra funktioner
sök i alla fönster, ersätt i redigeringsfönster och sök i flera filer (grep)
felsökare med permanenta brytpunkter, stepping och visning av globala och lokala namnrymder
konfiguration, webbläsare och andra dialogrutor
Uppstart och exekvering av kod¶
Vid uppstart med alternativet -s
kommer IDLE att köra den fil som miljövariablerna IDLESTARTUP
eller PYTHONSTARTUP
refererar till. IDLE kontrollerar först om IDLESTARTUP
finns; om IDLESTARTUP
finns körs den fil som refereras till. Om IDLESTARTUP
inte finns, kontrollerar IDLE om PYTHONSTARTUP
finns. Filer som refereras till av dessa miljövariabler är lämpliga platser för att lagra funktioner som används ofta från IDLE-skalet, eller för att köra importsatser för att importera vanliga moduler.
Dessutom laddar Tk
också en startfil om en sådan finns. Observera att Tk-filen läses in villkorslöst. Denna extra fil heter .Idle.py
och söks upp i användarens hemkatalog. Satser i den här filen kommer att exekveras i Tk-namnrymden, så den här filen är inte användbar för att importera funktioner som ska användas från IDLE:s Python-skal.
Användning av kommandoraden¶
IDLE kan anropas från kommandoraden med olika alternativ. Den allmänna syntaxen är:
python -m idlelib [alternativ] [fil ...]
Följande alternativ finns tillgängliga:
- -c <command>¶
Kör det angivna Python-kommandot i skalfönstret. Till exempel, skicka
-c "print('Hello, World!')"
. På Windows måste de yttre citaten vara dubbla citattecken som visas.
- -d¶
Aktivera felsökaren och öppna skalfönstret.
- -e¶
Öppna ett redigeringsfönster.
- -h¶
Skriv ut ett hjälpmeddelande med tillåtna kombinationer av alternativ och avsluta.
- -i¶
Öppna ett skalfönster.
- -r <file>¶
Kör den angivna filen i skalfönstret.
- -s¶
Kör startfilen (som definieras av miljövariablerna
IDLESTARTUP
ellerPYTHONSTARTUP
) innan du öppnar skalfönstret.
- -t <title>¶
Ange titeln på skalfönstret.
- -¶
Läser och exekverar standardinmatning i skalfönstret. Detta alternativ måste vara det sista före eventuella argument.
Om argument anges:
Om
-
,-c
eller-r
används placeras alla argument isys.argv[1:]
ochsys.argv[0]
sätts till''
,'-c'
eller'-r'
. Inget redigeringsfönster öppnas, även om det är standardinställningen i dialogrutan Options.I annat fall behandlas argumenten som filer som ska öppnas för redigering, och
sys.argv
återspeglar de argument som skickas till IDLE själv.
Fel vid uppstart¶
IDLE använder en socket för att kommunicera mellan IDLE GUI-processen och processen för exekvering av användarkoden. En anslutning måste upprättas varje gång Shell startar eller startas om. (Det senare indikeras av en skiljelinje med texten ”RESTART”). Om användarprocessen inte lyckas ansluta till GUI-processen visas vanligtvis en Tk
-felruta med meddelandet ”cannot connect” som hänvisar användaren hit. Därefter avslutas den.
Ett specifikt anslutningsfel på Unix-system beror på felkonfigurerade maskeringsregler någonstans i systemets nätverksinställningar. När IDLE startas från en terminal kommer man att se ett meddelande som börjar med ** Invalid host:
. Det giltiga värdet är 127.0.0.1 (idlelib.rpc.LOCALHOST)
. Man kan diagnostisera med tcpconnect -irv 127.0.0.1 6543
i ett terminalfönster och tcplisten <same args>
i ett annat.
En vanlig orsak till fel är en användarskriven fil med samma namn som en standardbiblioteksmodul, till exempel random.py och tkinter.py. När en sådan fil finns i samma katalog som en fil som ska köras, kan IDLE inte importera stdlib-filen. Den nuvarande lösningen är att byta namn på användarfilen.
Även om det är mindre vanligt än tidigare kan ett antivirus- eller brandväggsprogram stoppa anslutningen. Om det inte går att lära programmet att tillåta anslutningen måste det stängas av för att IDLE ska fungera. Det är säkert att tillåta den här interna anslutningen eftersom inga data syns på externa portar. Ett liknande problem kan uppstå om nätverket är felkonfigurerat och blockerar anslutningar.
Problem med Python-installationen stoppar ibland IDLE: flera versioner kan krocka, eller en enda installation kan behöva administratörsbehörighet. Om man ångrar kollisionen, eller inte kan eller vill köra som administratör, kan det vara enklast att helt ta bort Python och börja om.
En zombie pythonw.exe-process kan vara ett problem. I Windows kan du använda Aktivitetshanteraren för att kontrollera om det finns en sådan och stoppa den om det finns en. Ibland kan en omstart som initierats av en programkrasch eller ett tangentbordsavbrott (control-C) misslyckas med att ansluta. Om du avfärdar felrutan eller använder Restart Shell på Shell-menyn kan det lösa ett tillfälligt problem.
När IDLE startas första gången försöker den läsa användarkonfigurationsfiler i ~/.idlerc/
(~ är ens hemkatalog). Om det uppstår ett problem bör ett felmeddelande visas. Om man bortser från slumpmässiga diskproblem kan detta förhindras genom att aldrig redigera filerna för hand. Använd i stället konfigurationsdialogen under Alternativ. Om det har uppstått ett fel i en användarkonfigurationsfil kan den bästa lösningen vara att radera den och börja om från början med inställningsdialogen.
Om IDLE avslutas utan något meddelande och det inte startades från en konsol, försök att starta det från en konsol eller terminal (python -m idlelib
) och se om detta resulterar i ett felmeddelande.
På Unix-baserade system med tcl/tk äldre än 8.6.11
(se Om IDLE
) kan vissa tecken i vissa teckensnitt orsaka ett tk-fel med ett meddelande till terminalen. Detta kan hända antingen om man startar IDLE för att redigera en fil med ett sådant tecken eller senare när man skriver in ett sådant tecken. Om man inte kan uppgradera tcl/tk kan man konfigurera om IDLE så att det använder ett typsnitt som fungerar bättre.
Körning av användarkod¶
Med sällsynta undantag är resultatet av att exekvera Python-kod med IDLE avsett att vara detsamma som att exekvera samma kod med standardmetoden, direkt med Python i en systemkonsol eller ett terminalfönster i textläge. Det annorlunda gränssnittet och den annorlunda funktionen påverkar dock ibland synliga resultat. Till exempel börjar sys.modules
med fler poster och threading.active_count()
returnerar 2 istället för 1.
Som standard kör IDLE användarkoden i en separat OS-process i stället för i den process i användargränssnittet som kör skalet och redigeraren. I exekveringsprocessen ersätts sys.stdin
, sys.stdout
och sys.stderr
med objekt som hämtar indata från och skickar utdata till Shell-fönstret. De ursprungliga värdena som lagras i sys.__stdin__
, sys.__stdout__
och sys.__stderr__
påverkas inte, men kan vara None
.
Att skicka utskrifter från en process till en textwidget i en annan process går långsammare än att skriva ut till en systemterminal i samma process. Detta har störst effekt när flera argument skrivs ut, eftersom strängen för varje argument, varje separator och ny rad skickas separat. För utveckling är detta vanligtvis inte ett problem, men om man vill skriva ut snabbare i IDLE, formatera och sammanfoga allt man vill visa tillsammans och skriv sedan ut en enda sträng. Både formatsträngar och str.join()
kan hjälpa till att kombinera fält och rader.
IDLE:s standardflödesersättningar ärvs inte av underprocesser som skapas i exekveringsprocessen, vare sig direkt av användarkod eller av moduler som t.ex. multiprocessing. Om en sådan underprocess använder input
från sys.stdin eller print
eller write
till sys.stdout eller sys.stderr, bör IDLE startas i ett kommandoradsfönster. (I Windows, använd python
eller py
istället för pythonw
eller pyw
.) Den sekundära subprocessen kommer sedan att kopplas till det fönstret för in- och utdata.
Om sys
återställs av användarkod, t.ex. med importlib.reload(sys)
, går IDLE:s ändringar förlorade och inmatning från tangentbordet och utmatning till skärmen fungerar inte korrekt.
När Shell har fokus kontrollerar det tangentbordet och skärmen. Detta är normalt transparent, men funktioner som har direkt åtkomst till tangentbordet och skärmen fungerar inte. Det gäller bland annat systemspecifika funktioner som avgör om en tangent har tryckts ned och i så fall vilken.
IDLE-koden som körs i exekveringsprocessen lägger till ramar i anropsstacken som annars inte skulle finnas där. IDLE omsluter sys.getrecursionlimit
och sys.setrecursionlimit
för att minska effekten av de extra stapelramarna.
När användarkoden utlöser SystemExit, antingen direkt eller genom att anropa sys.exit, återgår IDLE till en Shell-prompt i stället för att avslutas.
Användarutdata i Shell¶
När ett program matar ut text bestäms resultatet av motsvarande utmatningsenhet. När IDLE exekverar användarkod ansluts sys.stdout
och sys.stderr
till visningsområdet i IDLE:s Shell. Vissa av dess funktioner är ärvda från den underliggande Tk Text-widgeten. Andra är programmerade tillägg. Shell är utformat för utveckling snarare än produktionskörningar.
Shell kastar t.ex. aldrig bort utdata. Ett program som skickar obegränsat med utdata till Shell kommer så småningom att fylla minnet, vilket resulterar i ett minnesfel. Däremot behåller vissa systemtextfönster bara de sista n raderna av utdata. En Windows-konsol, till exempel, behåller 1 till 9999 rader som kan ställas in av användaren, med 300 som standard.
En Tk Text-widget, och därmed IDLE:s Shell, visar tecken (kodpunkter) i BMP-undergruppen (Basic Multilingual Plane) i Unicode. Vilka tecken som visas med en korrekt glyf och vilka som visas med en ersättningsruta beror på operativsystemet och installerade teckensnitt. Tabbtecken gör att följande text börjar efter nästa tabbstopp. (De förekommer var 8:e ”tecken”). Newline-tecken gör att följande text visas på en ny rad. Andra kontrolltecken ignoreras eller visas som mellanslag, ruta eller något annat, beroende på operativsystem och teckensnitt. (Om du flyttar textmarkören genom sådana utdata med piltangenterna kan du få överraskande avstånd)
>>> s = 'a\tb\a<\x02><\r>\bc\nd' # Enter 22 chars.
>>> len(s)
14
>>> s # Display repr(s)
'a\tb\x07<\x02><\r>\x08c\nd'
>>> print(s, end='') # Display s as is.
# Result varies by OS and font. Try it.
Funktionen repr
används för interaktivt eko av uttrycksvärden. Den returnerar en ändrad version av indatasträngen där kontrollkoder, vissa BMP-kodpunkter och alla icke-BMP-kodpunkter ersätts med escape-koder. Som visats ovan kan man på detta sätt identifiera tecknen i en sträng, oavsett hur de visas.
Normal och felaktig utdata hålls i allmänhet åtskilda (på separata rader) från kodinmatning och varandra. De får olika färger för markering.
För SyntaxError-spårningar ersätts den normala ”^”-markeringen där felet upptäcktes med att texten färgas med en felmarkering. När kod som körs från en fil orsakar andra undantag kan man högerklicka på en spårningsrad för att hoppa till motsvarande rad i en IDLE-redigerare. Filen kommer att öppnas om det behövs.
Shell har en speciell funktion för att klämma ihop utdatarader till en ”Klämd text”-etikett. Detta görs automatiskt för utdata över N rader (N = 50 som standard). N kan ändras i PyShell-avsnittet på sidan Allmänt i dialogrutan Inställningar. Utdata med färre rader kan pressas genom att högerklicka på utdata. Detta kan vara användbart för rader som är tillräckligt långa för att sakta ner skrollningen.
Pressad utdata expanderas på plats genom att dubbelklicka på etiketten. Den kan också skickas till urklipp eller ett separat visningsfönster genom att högerklicka på etiketten.
Utveckla tkinter-applikationer¶
IDLE skiljer sig avsiktligt från standard-Python för att underlätta utvecklingen av tkinter-program. Skriv import tkinter as tk; root = tk.Tk()
i standard Python och ingenting visas. Skriv samma sak i IDLE och ett tk-fönster visas. I standard Python måste man också skriva root.update()
för att se fönstret. IDLE gör motsvarande i bakgrunden, ungefär 20 gånger per sekund, vilket är ungefär var 50:e millisekund. Därefter skriver du in b = tk.Button(root, text='button'); b.pack()
. Återigen ändras ingenting synligt i standard Python förrän man skriver in root.update()
.
Most tkinter programs run root.mainloop()
, which usually does not
return until the tk app is destroyed. If the program is run with
python -i
or from an IDLE editor, a >>>
shell prompt does not
appear until mainloop()
returns, at which time there is nothing left
to interact with.
När man kör ett tkinter-program från en IDLE-editor kan man kommentera ut mainloop-anropet. Man får då omedelbart en shell-prompt och kan interagera med live-applikationen. Man måste bara komma ihåg att återaktivera mainloop-anropet när man kör i standard-Python.
Körning utan en subprocess¶
Som standard kör IDLE användarkoden i en separat underprocess via en socket som använder det interna loopback-gränssnittet. Den här anslutningen är inte synlig externt och inga data skickas till eller tas emot från internet. Om brandväggsprogrammet ändå klagar kan du ignorera det.
Om försöket att upprätta socketanslutningen misslyckas kommer Idle att meddela dig. Sådana misslyckanden är ibland övergående, men om de är ihållande kan problemet antingen vara en brandvägg som blockerar anslutningen eller felaktig konfiguration av ett visst system. Tills problemet är åtgärdat kan man köra Idle med kommandoradsväxeln -n.
Om IDLE startas med kommandoradsbytet -n kommer det att köras i en enda process och inte skapa den underprocess som kör RPC Python-körningsservern. Detta kan vara användbart om Python inte kan skapa subprocessen eller RPC-socketgränssnittet på din plattform. I det här läget är dock användarkoden inte isolerad från IDLE själv. Miljön startas inte heller om när Run/Run Module (F5) väljs. Om din kod har ändrats måste du ladda om() de berörda modulerna och återimportera alla specifika objekt (t.ex. from foo import baz) om ändringarna ska träda i kraft. Av dessa skäl är det att föredra att köra IDLE med standardunderprocessen om det är möjligt.
Föråldrad sedan version 3.4.
Hjälp och inställningar¶
Hjälp källor¶
Hjälpmenyposten ”IDLE Help” visar en formaterad html-version av IDLE-kapitlet i Library Reference. Resultatet, i ett skrivskyddat tkinter-textfönster, liknar det man ser i en webbläsare. Navigera genom texten med ett mushjul, rullningslisten eller nedtryckta piltangenter upp och ned. Eller klicka på knappen TOC (Table of Contents) och välj en avsnittsrubrik i den öppnade rutan.
Hjälpmenyalternativet ”Python Docs” öppnar de omfattande hjälpkällorna, inklusive självstudier, som finns på docs.python.org/x.y
, där ’x.y’ är den Python-version som körs för tillfället. Om ditt system har en offlinekopia av dokumenten (detta kan vara ett installationsalternativ) öppnas den istället.
Valda webbadresser kan när som helst läggas till eller tas bort från hjälpmenyn på fliken Allmänt i dialogrutan Konfigurera IDLE.
Inställning av preferenser¶
Inställningarna för teckensnitt, markering, tangenter och allmänna inställningar kan ändras via Configure IDLE på menyn Option. Användarinställningar som inte är standard sparas i katalogen .idlerc
i användarens hemkatalog. Problem som orsakas av felaktiga användarkonfigurationsfiler löses genom att redigera eller radera en eller flera av filerna i .idlerc
.
På fliken Font kan du se textexemplet för effekten av teckensnitt och storlek på flera tecken på flera språk. Redigera exemplet för att lägga till andra tecken av personligt intresse. Använd exemplet för att välja monospaced-teckensnitt. Om vissa tecken har problem i Shell eller en editor, lägg till dem överst i exemplet och prova att ändra först storlek och sedan typsnitt.
På fliken Highlights and Keys väljer du ett inbyggt eller anpassat färgtema och en nyckeluppsättning. Om du vill använda ett nyare inbyggt färgtema eller en ny nyckeluppsättning med äldre IDLEs sparar du det som ett nytt anpassat tema eller en ny nyckeluppsättning så att det blir tillgängligt för äldre IDLEs.
IDLE på macOS¶
Under Systeminställningar: Dock kan man ställa in ”Föredra flikar när du öppnar dokument” till ”Alltid”. Den här inställningen är inte kompatibel med tk/tkinter GUI-ramverket som används av IDLE, och den bryter några IDLE-funktioner.
Tillägg¶
IDLE innehåller en funktion för tillägg. Inställningar för tillägg kan ändras på fliken Tillägg i inställningsdialogen. Se början av config-extensions.def i katalogen idlelib för ytterligare information. Det enda aktuella standardtillägget är zzdummy, ett exempel som också används för testning.
idlelib — implementering av IDLE-applikation¶
Källkod: Lib/idlelib
Paketet Lib/idlelib implementerar programmet IDLE. Se resten av den här sidan för hur du använder IDLE.
Filerna i idlelib beskrivs i idlelib/README.txt. Du kan komma åt den antingen i idlelib eller genom att klicka på Hjälp => Om IDLE på IDLE-menyn. Den här filen mappar också IDLE-menyobjekt till koden som implementerar objektet. Med undantag för filer som listas under ”Startup” är idlelib-koden ”privat” i den meningen att funktionsändringar kan bakåtporteras (se PEP 434).