Vanliga frågor om Python på Windows¶
Hur kör jag ett Python-program under Windows?¶
Det här är inte nödvändigtvis en enkel fråga. Om du redan är bekant med att köra program från kommandoraden i Windows kommer allt att verka självklart, men annars kan du behöva lite mer vägledning.
Om du inte använder någon form av integrerad utvecklingsmiljö kommer du att sluta med att skriva Windows-kommandon i vad som kallas ett ”kommandotolkfönster”. Vanligtvis kan du skapa ett sådant fönster från ditt sökfält genom att söka efter cmd
. Du bör kunna känna igen när du har startat ett sådant fönster eftersom du kommer att se en Windows ”kommandotolk”, som vanligtvis ser ut så här:
C:\>
Bokstaven kan vara annorlunda, och det kan finnas andra saker efter den, så du kan lika gärna se något i stil med:
D:\Ditt namn\Projekt\Python>
beroende på hur din dator har konfigurerats och vad du har gjort med den den senaste tiden. När du väl har startat ett sådant fönster är du på god väg att köra Python-program.
Du måste inse att dina Python-skript måste bearbetas av ett annat program som kallas Python tolk. Tolken läser ditt skript, kompilerar det till bytecodes och kör sedan bytecodes för att köra ditt program. Så hur gör du för att tolken ska hantera ditt Python?
Först måste du se till att ditt kommandofönster känner igen ordet ”py” som en instruktion för att starta tolken. Om du har öppnat ett kommandofönster bör du försöka skriva in kommandot py
och trycka på retur:
C:\Användare\Ditt Namn> py
Du bör då se något liknande:
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
Du har startat tolken i ”interaktivt läge”. Det betyder att du kan skriva in Python-satser eller -uttryck interaktivt och få dem exekverade eller utvärderade medan du väntar. Detta är en av Pythons starkaste funktioner. Kontrollera det genom att skriva in några valfria uttryck och se resultatet:
>>> print("Hello")
Hello
>>> "Hello" * 3
'HelloHelloHello'
Många använder det interaktiva läget som en bekväm men ändå mycket programmerbar miniräknare. När du vill avsluta din interaktiva Python-session anropar du funktionen exit()
eller håller ned Ctrl medan du skriver in Z och trycker sedan på ”Enter” för att komma tillbaka till Windows kommandotolk.
You may also find that you have a Start-menu entry such as >>>
prompt in a new window. If so, the window will disappear
after you call the exit()
function or enter the Ctrl-Z
character; Windows is running a single ”python”
command in the window, and closes it when you terminate the interpreter.
Nu när vi vet att kommandot py
känns igen kan du ge ditt Python-skript till det. Du måste ange antingen en absolut eller en relativ sökväg till Python-skriptet. Låt oss säga att ditt Python-skript finns på ditt skrivbord och heter hello.py
, och din kommandotolk öppnas snyggt i din hemkatalog så att du ser något liknande:
C:\Användare\Ditt Namn>
Så nu ska du be kommandot py
att ge ditt skript till Python genom att skriva py
följt av din skriptsökväg:
C:\Användare\Ditt Namn> py Desktop\hello.py
hej
Hur gör jag Python-skript körbara?¶
I Windows associerar Pythons standardinstallationsprogram redan .py-tillägget med en filtyp (Python.File) och ger filtypen ett öppningskommando som kör tolken (D:\Program Files\Python\python.exe "%1" %*
). Detta är tillräckligt för att göra skript körbara från kommandotolken som ”foo.py”. Om du hellre vill kunna köra skriptet genom att bara skriva ”foo” utan något tillägg måste du lägga till .py i PATHEXT-miljövariabeln.
Varför tar det ibland så lång tid för Python att starta?¶
Vanligtvis startar Python mycket snabbt i Windows, men ibland kommer det in felrapporter om att Python plötsligt börjar ta lång tid på sig att starta. Detta blir ännu mer förbryllande eftersom Python fungerar bra på andra Windows-system som verkar vara konfigurerade på samma sätt.
Problemet kan bero på en felaktig konfiguration av viruskontrollprogramvaran på problemdatorn. Vissa virusskannrar är kända för att införa ett startoverhead på två storleksordningar när skannern är konfigurerad för att övervaka alla läsningar från filsystemet. Försök att kontrollera konfigurationen av virusskanningsprogram på dina system för att säkerställa att de verkligen är konfigurerade på samma sätt. McAfee, när det är konfigurerat för att skanna all läsaktivitet i filsystemet, är en särskild förbrytare.
Hur skapar jag en körbar fil från ett Python-skript?¶
Se Hur kan jag skapa en fristående binär från ett Python-skript? för en lista över verktyg som kan användas för att skapa körbara filer.
Är en *.pyd
-fil samma sak som en DLL?¶
Ja, .pyd-filer är dll:er, men det finns några skillnader. Om du har en DLL som heter foo.pyd
, så måste den ha en funktion PyInit_foo()
. Du kan sedan skriva Python ”import foo”, och Python kommer att söka efter foo.pyd (liksom foo.py, foo.pyc) och om den hittar den, kommer den att försöka anropa PyInit_foo()
för att initiera den. Du länkar inte din .exe med foo.lib, eftersom det skulle få Windows att kräva att DLL:en finns.
Observera att sökvägen för foo.pyd är PYTHONPATH, inte samma som den sökväg som Windows använder för att söka efter foo.dll. Dessutom behöver foo.pyd inte finnas för att köra programmet, men om du har länkat programmet med en dll-fil krävs dll-filen. Naturligtvis krävs foo.pyd om du vill säga import foo
. I en DLL deklareras länkning i källkoden med __declspec(dllexport)
. I en .pyd definieras länkningen i en lista över tillgängliga funktioner.
Hur kan jag bädda in Python i en Windows-applikation?¶
Att bädda in Python-tolken i en Windows-app kan sammanfattas på följande sätt:
Bygg inte in Python direkt i din .exe-fil. På Windows måste Python vara en DLL för att hantera import av moduler som själva är DLL:er. (Detta är det första viktiga odokumenterade faktumet.) Länka istället till
pythonNN.dll
; den installeras vanligtvis iC:\Windows\System
. NN är Python-versionen, en siffra som ”33” för Python 3.3.Du kan länka till Python på två olika sätt. Laddningstidslänkning innebär länkning mot
pythonNN.lib
, medan körtidslänkning innebär länkning motpythonNN.dll
. (Allmän anmärkning:pythonNN.lib
är den så kallade ”import lib” som motsvararpythonNN.dll
. Det definierar bara symboler för länkaren)Körtidslänkning förenklar länkalternativen avsevärt; allt sker vid körning. Din kod måste ladda
pythonNN.dll
med Windows-rutinenLoadLibraryEx()
. Koden måste också använda åtkomstrutiner och data ipythonNN.dll
(det vill säga Pythons C API:er) med hjälp av pekare som erhålls med Windows-rutinenGetProcAddress()
. Makron kan göra användningen av dessa pekare transparent för all C-kod som anropar rutiner i Pythons C API.Om du använder SWIG är det enkelt att skapa en Python ”extension module” som gör appens data och metoder tillgängliga för Python. SWIG kommer att hantera nästan alla de smutsiga detaljerna åt dig. Resultatet är C-kod som du länkar till din .exe-fil (!) Du behöver inte skapa en DLL-fil, och detta förenklar också länkningen.
SWIG kommer att skapa en init-funktion (en C-funktion) vars namn beror på namnet på tilläggsmodulen. Om modulens namn t.ex. är leo, kommer init-funktionen att heta initleo(). Om du använder SWIG:s skuggklasser, vilket du bör göra, kommer init-funktionen att heta initleoc(). Detta initialiserar en mestadels dold hjälpklass som används av skuggklassen.
Anledningen till att du kan länka C-koden i steg 2 till din .exe-fil är att anrop av initialiseringsfunktionen motsvarar import av modulen till Python! (Detta är det andra viktiga odokumenterade faktumet.)
Kort sagt kan du använda följande kod för att initiera Python-tolken med din tilläggsmodul.
#include <Python.h> ... Py_Initialize(); // Initialize Python. initmyAppc(); // Initialize (import) the helper class. PyRun_SimpleString("import myApp"); // Import the shadow class.
Det finns två problem med Pythons C API som blir uppenbara om du använder en annan kompilator än MSVC, den kompilator som användes för att bygga pythonNN.dll.
Problem 1: De så kallade ”Very High Level”-funktionerna som tar argument av typen
FILE *
fungerar inte i en miljö med flera kompilatorer, eftersom varje kompilator har sin egen definition avstruct FILE
. Ur implementeringssynpunkt är detta mycket lågnivåfunktioner.Problem 2: SWIG genererar följande kod när man genererar omslag till void-funktioner:
Py_INCREF(Py_None); _resultobj = Py_None; return _resultobj;
Tyvärr är Py_None ett makro som expanderar till en referens till en komplex datastruktur som heter _Py_NoneStruct i pythonNN.dll. Återigen kommer den här koden att misslyckas i en miljö med flera kompilatorer. Ersätt sådan kod med:
return Py_BuildValue("");
Det kan vara möjligt att använda SWIGs
%typemap
-kommando för att göra ändringen automatiskt, men jag har inte lyckats få det att fungera (jag är en fullständig SWIG-nybörjare).Det är ingen bra idé att använda ett Python-skalskript för att skapa ett Python-tolkningsfönster inifrån Windows-appen; det resulterande fönstret kommer att vara oberoende av appens fönstersystem. Istället bör du (eller wxPythonWindow-klassen) skapa ett ”inbyggt” tolkningsfönster. Det är lätt att ansluta det fönstret till Python-tolken. Du kan omdirigera Pythons i/o till _valfritt_ objekt som stöder läsning och skrivning, så allt du behöver är ett Python-objekt (definierat i din tilläggsmodul) som innehåller read()- och write()-metoder.
Hur hindrar jag redaktörer från att infoga tabbar i min Python-källa?¶
FAQ rekommenderar inte att tabbar används och Python Style Guide, PEP 8, rekommenderar 4 mellanslag för distribuerad Python-kod; detta är också Emacs python-mode standard.
I alla editorer är det en dålig idé att blanda tabbar och mellanslag. MSVC är inte annorlunda i detta avseende och är lätt att konfigurera för att använda mellanslag: Ta
, och för filtypen ”Default” ställ in ”Tab size” och ”Indent size” till 4, och välj alternativknappen ”Insert spaces”.Python ger IndentationError
eller TabError
om blandade tabbar och mellanslag orsakar problem med att leda blanksteg. Du kan också köra modulen tabnanny
för att kontrollera ett katalogträd i batch-läge.
Hur kontrollerar jag en knapptryckning utan att blockera?¶
Använd modulen msvcrt
. Detta är en standard Windows-specifik tilläggsmodul. Den definierar funktionen kbhit()
som kontrollerar om det finns en tangentbordsträff, och getch()
som hämtar ett tecken utan att eka det.
Hur löser jag felet api-ms-win-crt-runtime-l1-1-0.dll som saknas?¶
Detta kan inträffa på Python 3.5 och senare när du använder Windows 8.1 eller tidigare utan att alla uppdateringar har installerats. Kontrollera först att operativsystemet stöds och är uppdaterat, och om det inte löser problemet, besök Microsofts supportsida för vägledning om hur du manuellt installerar C Runtime-uppdateringen.