Python unter Windows FAQ

Wie führe ich ein Python-Programm unter Windows aus?

Dies ist nicht unbedingt eine einfache Frage. Wenn Sie bereits mit dem Ausführen von Programmen über die Windows-Kommandozeile vertraut sind, wird alles offensichtlich erscheinen; andernfalls benötigen Sie möglicherweise etwas mehr Anleitung.

Sofern Sie keine integrierte Entwicklungsumgebung verwenden, werden Sie schließlich Windows-Befehle in einem sogenannten „Eingabeaufforderungsfenster“ *eingeben*. Normalerweise können Sie ein solches Fenster über die Suchleiste erstellen, indem Sie nach cmd suchen. Sie sollten erkennen können, wenn Sie ein solches Fenster gestartet haben, da Sie eine Windows-„Eingabeaufforderung“ sehen, die normalerweise so aussieht:

C:\>

Der Buchstabe kann sich ändern, und danach können noch andere Dinge stehen. Daher kann es genauso gut sein, dass Sie etwas sehen wie

D:\YourName\Projects\Python>

abhängig davon, wie Ihr Computer eingerichtet wurde und was Sie kürzlich damit gemacht haben. Sobald Sie ein solches Fenster gestartet haben, sind Sie auf dem besten Weg, Python-Programme auszuführen.

Sie müssen sich bewusst sein, dass Ihre Python-Skripte von einem anderen Programm, dem Python- *Interpreter*, verarbeitet werden müssen. Der Interpreter liest Ihr Skript, kompiliert es in Bytecodes und führt dann die Bytecodes aus, um Ihr Programm auszuführen. Wie also arrangieren Sie es, dass der Interpreter Ihr Python verarbeitet?

Stellen Sie zuerst sicher, dass Ihr Befehlsfenster das Wort „py“ als Anweisung zum Starten des Interpreters erkennt. Wenn Sie ein Befehlsfenster geöffnet haben, sollten Sie versuchen, den Befehl py einzugeben und Enter zu drücken

C:\Users\YourName> py

Sie sollten dann etwas Ähnliches wie dies sehen

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.
>>>

Sie haben den Interpreter im „interaktiven Modus“ gestartet. Das bedeutet, Sie können Python-Anweisungen oder -Ausdrücke interaktiv eingeben und sie sofort ausführen oder auswerten lassen. Dies ist eine der Stärken von Python. Überprüfen Sie dies, indem Sie einige Ausdrücke Ihrer Wahl eingeben und die Ergebnisse sehen

>>> print("Hello")
Hello
>>> "Hello" * 3
'HelloHelloHello'

Viele Leute benutzen den interaktiven Modus als praktischen und dennoch hochgradig programmierbaren Taschenrechner. Wenn Sie Ihre interaktive Python-Sitzung beenden möchten, rufen Sie die Funktion exit() auf oder halten Sie die Strg-Taste gedrückt, während Sie Z eingeben, und drücken Sie dann die „Enter“-Taste, um zu Ihrer Windows-Eingabeaufforderung zurückzukehren.

Möglicherweise finden Sie auch einen Eintrag im Startmenü, wie z. B. Start ‣ Programme ‣ Python 3.x ‣ Python (Kommandozeile), der dazu führt, dass Sie die Aufforderung >>> in einem neuen Fenster sehen. Wenn ja, verschwindet das Fenster, nachdem Sie die Funktion exit() aufgerufen haben oder das Zeichen Strg-Z eingegeben haben; Windows führt einen einzigen „python“-Befehl in dem Fenster aus und schließt es, wenn Sie den Interpreter beenden.

Da wir nun wissen, dass der Befehl py erkannt wird, können Sie ihm Ihr Python-Skript übergeben. Sie müssen entweder einen absoluten oder einen relativen Pfad zum Python-Skript angeben. Nehmen wir an, Ihr Python-Skript befindet sich auf Ihrem Desktop und heißt hello.py, und Ihre Eingabeaufforderung ist ordnungsgemäß in Ihrem Home-Verzeichnis geöffnet, sodass Sie etwas Ähnliches wie dies sehen:

C:\Users\YourName>

Nun werden Sie den Befehl py bitten, Ihr Skript an Python zu übergeben, indem Sie py gefolgt von Ihrem Skriptpfad eingeben:

C:\Users\YourName> py Desktop\hello.py
hello

Wie mache ich Python-Skripte ausführbar?

Unter Windows assoziiert der Standard-Python-Installer bereits die Erweiterung .py mit einem Dateityp (Python.File) und weist diesem Dateityp einen Öffnungsbefehl zu, der den Interpreter ausführt (D:\Program Files\Python\python.exe "%1" %*). Dies reicht aus, um Skripte von der Kommandozeile als ‚foo.py‘ ausführbar zu machen. Wenn Sie lieber in der Lage sein möchten, das Skript durch einfaches Eingeben von ‚foo‘ ohne Erweiterung auszuführen, müssen Sie .py zur Umgebungsvariablen PATHEXT hinzufügen.

Warum dauert der Start von Python manchmal so lange?

Normalerweise startet Python unter Windows sehr schnell, aber gelegentlich gibt es Fehlerberichte, dass Python plötzlich sehr lange zum Starten braucht. Dies ist umso verwirrender, da Python auf anderen Windows-Systemen, die identisch konfiguriert zu sein scheinen, einwandfrei funktioniert.

Das Problem kann durch eine Fehlkonfiguration der Virenprüfsoftware auf dem betroffenen Rechner verursacht werden. Einige Virenscanner sind dafür bekannt, beim Start einen Overhead von zwei Größenordnungen einzuführen, wenn der Scanner so konfiguriert ist, dass er alle Lesezugriffe auf das Dateisystem überwacht. Versuchen Sie, die Konfiguration der Virenprüfsoftware auf Ihren Systemen zu überprüfen, um sicherzustellen, dass sie tatsächlich identisch konfiguriert sind. McAfee ist ein besonderer Übeltäter, wenn es so konfiguriert ist, dass es alle Dateisystem-Leseaktivitäten scannt.

Wie erstelle ich eine ausführbare Datei aus einem Python-Skript?

Siehe Wie kann ich eine eigenständige Binärdatei aus einem Python-Skript erstellen? für eine Liste von Werkzeugen, die zur Erstellung ausführbarer Dateien verwendet werden können.

Ist eine *.pyd-Datei dasselbe wie eine DLL?

Ja, .pyd-Dateien sind DLLs, aber es gibt ein paar Unterschiede. Wenn Sie eine DLL namens foo.pyd haben, muss diese eine Funktion PyInit_foo() enthalten. Sie können dann Python schreiben „import foo“, und Python sucht nach foo.pyd (sowie foo.py, foo.pyc) und versucht, PyInit_foo() aufzurufen, um es zu initialisieren. Sie verknüpfen Ihr .exe nicht mit foo.lib, da dies dazu führen würde, dass Windows die DLL benötigt.

Beachten Sie, dass der Suchpfad für foo.pyd PYTHONPATH ist und nicht derselbe wie der Pfad, den Windows zur Suche nach foo.dll verwendet. Außerdem muss foo.pyd nicht vorhanden sein, um Ihr Programm auszuführen, während die DLL erforderlich ist, wenn Sie Ihr Programm mit einer DLL verknüpft haben. Natürlich ist foo.pyd erforderlich, wenn Sie import foo sagen möchten. In einer DLL wird die Verknüpfung im Quellcode mit __declspec(dllexport) deklariert. In einer .pyd wird die Verknüpfung in einer Liste verfügbarer Funktionen definiert.

Wie kann ich Python in eine Windows-Anwendung einbetten?

Das Einbetten des Python-Interpreters in eine Windows-App lässt sich wie folgt zusammenfassen:

  1. Bauen Sie Python **nicht** direkt in Ihre .exe-Datei ein. Unter Windows muss Python eine DLL sein, um Module importieren zu können, die selbst DLLs sind. (Dies ist die erste wichtige, undokumentierte Tatsache.) Verknüpfen Sie stattdessen mit pythonNN.dll; diese wird typischerweise in C:\Windows\System installiert. *NN* ist die Python-Version, eine Zahl wie „33“ für Python 3.3.

    Sie können Python auf zwei verschiedene Arten verknüpfen. Die Ladezeitverknüpfung bedeutet die Verknüpfung mit pythonNN.lib, während die Laufzeitverknüpfung die Verknüpfung mit pythonNN.dll bedeutet. (Allgemeiner Hinweis: pythonNN.lib ist die sogenannte „Import-Bibliothek“, die zu pythonNN.dll gehört. Sie definiert lediglich Symbole für den Linker.)

    Die Laufzeitverknüpfung vereinfacht die Linker-Optionen erheblich; alles geschieht zur Laufzeit. Ihr Code muss pythonNN.dll mit der Windows-Routine LoadLibraryEx() laden. Der Code muss auch Zugriffsroutinen und Daten in pythonNN.dll (d. h. die C-API von Python) über Zeiger abrufen, die mit der Windows-Routine GetProcAddress() erhalten wurden. Makros können die Verwendung dieser Zeiger für jeden C-Code, der Routinen in der C-API von Python aufruft, transparent machen.

  2. Wenn Sie SWIG verwenden, ist es einfach, ein Python-„Erweiterungsmodul“ zu erstellen, das die Daten und Methoden der App für Python verfügbar macht. SWIG kümmert sich um fast alle schmutzigen Details für Sie. Das Ergebnis ist C-Code, den Sie *in* Ihre .exe-Datei verknüpfen (!) Sie müssen keine DLL-Datei erstellen, und dies vereinfacht auch die Verknüpfung.

  3. SWIG erstellt eine Init-Funktion (eine C-Funktion), deren Name vom Namen des Erweiterungsmoduls abhängt. Wenn der Modulname beispielsweise leo ist, wird die Init-Funktion initleo() aufgerufen. Wenn Sie SWIG-Schattenklassen verwenden, was Sie tun sollten, wird die Init-Funktion initleoc() aufgerufen. Dies initialisiert eine weitgehend versteckte Hilfsklasse, die von der Schattenklasse verwendet wird.

    Der Grund, warum Sie den C-Code in Schritt 2 in Ihre .exe-Datei verknüpfen können, ist, dass der Aufruf der Initialisierungsfunktion dem Importieren des Moduls in Python gleichkommt! (Dies ist die zweite wichtige, undokumentierte Tatsache.)

  4. Kurz gesagt, Sie können den folgenden Code verwenden, um den Python-Interpreter mit Ihrem Erweiterungsmodul zu initialisieren.

    #include <Python.h>
    ...
    Py_Initialize();  // Initialize Python.
    initmyAppc();  // Initialize (import) the helper class.
    PyRun_SimpleString("import myApp");  // Import the shadow class.
    
  5. Es gibt zwei Probleme mit der C-API von Python, die offensichtlich werden, wenn Sie einen anderen Compiler als MSVC, den Compiler, der zum Erstellen von pythonNN.dll verwendet wird, verwenden.

    Problem 1: Die sogenannten „Very High Level“-Funktionen, die FILE *-Argumente entgegennehmen, funktionieren in einer Multi-Compiler-Umgebung nicht, da jede Compiler-Version eines struct FILE unterschiedlich ist. Aus Implementierungssicht sind dies sehr Low-Level-Funktionen.

    Problem 2: SWIG generiert beim Generieren von Wrapper für void-Funktionen folgenden Code:

    Py_INCREF(Py_None);
    _resultobj = Py_None;
    return _resultobj;
    

    Leider ist Py_None ein Makro, das sich zu einem Verweis auf eine komplexe Datenstruktur namens _Py_NoneStruct innerhalb von pythonNN.dll erweitert. Auch dieser Code schlägt in einer Multi-Compiler-Umgebung fehl. Ersetzen Sie solchen Code durch:

    return Py_BuildValue("");
    

    Es ist möglich, den Befehl %typemap von SWIG zu verwenden, um die Änderung automatisch vorzunehmen, obwohl ich dies bisher nicht zum Laufen gebracht habe (ich bin ein absoluter SWIG-Neuling).

  6. Die Verwendung eines Python-Shell-Skripts, um ein Python-Interpreterfenster aus Ihrer Windows-App heraus aufzurufen, ist keine gute Idee; das resultierende Fenster wäre unabhängig vom Fenstersystem Ihrer App. Vielmehr sollten Sie (oder die wxPythonWindow-Klasse) ein „natives“ Interpreterfenster erstellen. Es ist einfach, dieses Fenster mit dem Python-Interpreter zu verbinden. Sie können die Ein- und Ausgabe von Python auf _jedes_ Objekt umleiten, das Lesen und Schreiben unterstützt. Alles, was Sie brauchen, ist also ein Python-Objekt (definiert in Ihrem Erweiterungsmodul), das read()- und write()-Methoden enthält.

Wie verhindere ich, dass Editoren Tabs in meinen Python-Quellcode einfügen?

Die FAQ empfiehlt die Verwendung von Tabs nicht, und der Python-Stilrichtlinie PEP 8 empfiehlt 4 Leerzeichen für verteilten Python-Code; dies ist auch der Standard in Emacs python-mode.

In jedem Editor ist die Mischung von Tabs und Leerzeichen eine schlechte Idee. MSVC ist in dieser Hinsicht keine Ausnahme und lässt sich leicht konfigurieren, um Leerzeichen zu verwenden: Gehen Sie zu Extras ‣ Optionen ‣ Tabs und stellen Sie für den Dateityp „Standard“ „Tabulatorgröße“ und „Einzugshöhe“ auf 4 ein und wählen Sie die Option „Leerzeichen einfügen“ aus.

Python löst IndentationError oder TabError aus, wenn gemischte Tabs und Leerzeichen Probleme mit der führenden Leerzeichen verursachen. Sie können auch das Modul tabnanny ausführen, um einen Verzeichnisbaum im Stapelbetrieb zu überprüfen.

Wie prüfe ich auf Tastendrücke, ohne zu blockieren?

Verwenden Sie das Modul msvcrt. Dies ist ein standardmäßiges, Windows-spezifisches Erweiterungsmodul. Es definiert die Funktion kbhit(), die prüft, ob ein Tastendruck vorliegt, und getch(), die ein Zeichen ohne Echo abruft.

Wie löse ich den Fehler „missing api-ms-win-crt-runtime-l1-1-0.dll“?

Dies kann unter Python 3.5 und neueren Versionen bei Verwendung von Windows 8.1 oder älter ohne installierte Updates auftreten. Stellen Sie zunächst sicher, dass Ihr Betriebssystem unterstützt und auf dem neuesten Stand ist. Wenn dies das Problem nicht löst, besuchen Sie die Microsoft-Supportseite, um Anleitungen zur manuellen Installation des C-Runtime-Updates zu erhalten.