FAQ : Python et Windows

Comment exécuter un programme Python sous Windows ?

Ce n’est pas forcément une question simple. Si vous êtes déjà familier avec le lancement de programmes depuis la ligne de commande de Windows alors tout semblera évident; Sinon, vous auriez besoin d’être un peu guidé.

Unless you use some sort of integrated development environment, you will end up typing Windows commands into what is variously referred to as a « DOS window » or « Command prompt window ». Usually you can create such a window from your Start menu; under Windows 7 the menu selection is Start ‣ Programs ‣ Accessories ‣ Command Prompt. You should be able to recognize when you have started such a window because you will see a Windows « command prompt », which usually looks like this:

C:\>

la lettre peut être différente, et il peut y avoir d’autres choses à la suite, alors il se peut aussi bien que vous voyez quelque chose tel que:

D:\YourName\Projects\Python>

selon la configuration de votre ordinateur et ce que vous avez récemment fait avec. Une fois que vous avez ouvert cette fenêtre, vous êtes bien partis pour pouvoir lancer des programmes Python.

Retenez que vos scripts Python doivent être traités par un autre programme appelé « l’interpréteur » Python. L’interpréteur lit votre script, le compile en bytecode, et exécute le bytecode pour faire tourner votre programme. Alors, comment faire pour donner votre code Python à l’interpréteur ?

First, you need to make sure that your command window recognises the word « python » as an instruction to start the interpreter. If you have opened a command window, you should try entering the command python and hitting return.:

C:\Users\YourName> python

You should then see something like:

Python 2.7.3 (default, Apr 10 2012, 22.71:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

You have started the interpreter in « interactive mode ». That means you can enter Python statements or expressions interactively and have them executed or evaluated while you wait. This is one of Python’s strongest features. Check it by entering a few expressions of your choice and seeing the results:

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

Beaucoup de personnes utilisent le mode interactif comme une calculatrice programmable. Lorsque vous souhaitez sortir du mode interactif de Python, maintenez la touche Ctrl appuyée, puis appuyez sur Z. Validez avec « Entrée » pour retrouver votre ligne de commande Windows.

You may also find that you have a Start-menu entry such as Start ‣ Programs ‣ Python 2.7 ‣ Python (command line) that results in you seeing the >>> prompt in a new window. If so, the window will disappear after you enter the Ctrl-Z character; Windows is running a single « python » command in the window, and closes it when you terminate the interpreter.

Si, au lieu de vous afficher >>> la commande python vous affiche un message semblable à celui-ci :

'python' is not recognized as an internal or external command, operable program or batch file.

ou :

Bad command or filename

alors, vous devez vous assurer que votre ordinateur sait où trouver l’interpréteur Python. Pour cela, vous devez modifier un paramètre, appelé « PATH », qui est une liste des répertoires dans lesquels Windows cherche les programmes.

You should arrange for Python’s installation directory to be added to the PATH of every command window as it starts. If you installed Python fairly recently then the command

dir C:\py*

will probably tell you where it is installed; the usual location is something like C:\Python27. Otherwise you will be reduced to a search of your whole disk … use Tools ‣ Find or hit the Search button and look for « python.exe ». Supposing you discover that Python is installed in the C:\Python27 directory (the default at the time of writing), you should make sure that entering the command

c:\Python27\python

starts up the interpreter as above (and don’t forget you’ll need a « Ctrl-Z » and an « Enter » to get out of it). Once you have verified the directory, you can add it to the system path to make it easier to start Python by just running the python command. This is currently an option in the installer as of CPython 2.7.

More information about environment variables can be found on the Using Python on Windows page.

Comment rendre des scripts Python exécutables ?

Sous Windows, l’installateur Python associe l’extension .py avec un type de fichier (Python.File) et une commande qui lance l’interpréteur (D:\Program Files\Python\python.exe "%1" %*). Cela suffit pour pouvoir exécuter les scripts Python depuis la ligne de commande en saisissant foo.py. Si vous souhaitez pouvoir exécuter les scripts en saisissant simplement foo sans l’extension, vous devez ajouter .py au paramètre d’environnement PATHEXT.

Pourquoi Python met-il du temps à démarrer ?

Normalement, sous Windows, Python se lance très rapidement, mais parfois des rapports d’erreurs indiquent que Python commence soudain à prendre beaucoup de temps pour démarrer. C’est d’autant plus intrigant que Python fonctionne correctement avec d’autres Windows configurés de façon similaire.

Le problème peut venir d’un antivirus mal configuré. Certains antivirus sont connus pour doubler le temps de démarrage lorsqu’ils sont configurés pour surveiller toutes les lectures du système de fichiers. Essayez de regarder si les antivirus des deux machines sont bien paramétrés à l’identique. McAfee est particulièrement problématique lorsqu’il est paramétré pour surveiller toutes les lectures du système de fichiers.

Comment construire un exécutable depuis un script Python ?

See http://www.py2exe.org/ for a distutils extension that allows you to create console and GUI executables from Python code.

Est-ce qu’un fichier *.pyd est la même chose qu’une DLL ?

Yes, .pyd files are dll’s, but there are a few differences. If you have a DLL named foo.pyd, then it must have a function initfoo(). You can then write Python « import foo », and Python will search for foo.pyd (as well as foo.py, foo.pyc) and if it finds it, will attempt to call initfoo() to initialize it. You do not link your .exe with foo.lib, as that would cause Windows to require the DLL to be present.

Notez que le chemin de recherche pour foo.pyd est PYTHONPATH, il est différent de celui qu’utilise Windows pour rechercher foo.dll. De plus, foo.pyd n’a pas besoin d’être présent pour que votre programme s’exécute alors que si vous avez lié votre programme avec une dll celle-ci est requise. Bien sûr foo.pyd est nécessaire si vous écrivez import foo. Dans une DLL le lien est déclaré dans le code source avec __declspec(dllexport). Dans un .pyd la liaison est définie dans une liste de fonctions disponibles.

Comment puis-je intégrer Python dans une application Windows ?

L’intégration de l’interpréteur Python dans une application Windows peut se résumer comme suit :

  1. Do _not_ build Python into your .exe file directly. On Windows, Python must be a DLL to handle importing modules that are themselves DLL’s. (This is the first key undocumented fact.) Instead, link to pythonNN.dll; it is typically installed in C:\Windows\System. NN is the Python version, a number such as « 27 » for Python 2.7.

    Vous pouvez créer un lien vers Python de deux manières différentes. Un lien au moment du chargement signifie pointer vers pythonNN.lib, tandis qu’un lien au moment de l’exécution signifie pointer vers pythonNN.dll. (Note générale : pythonNN.lib est le soi-disant « import lib » correspondant à pythonNN.dll. Il définit simplement des liens symboliques pour l’éditeur de liens.)

    La liaison en temps réel simplifie grandement les options de liaison ; tout se passe au moment de l’exécution. Votre code doit charger pythonNN.dll en utilisant la routine Windows LoadLibraryEx(). Le code doit aussi utiliser des routines d’accès et des données dans pythonNN.dll (c’est-à-dire les API C de Python) en utilisant des pointeurs obtenus par la routine Windows GetProcAddress(). Les macros peuvent rendre l’utilisation de ces pointeurs transparente à tout code C qui appelle des routines dans l’API C de Python.

    Note Borland : convertir pythonNN.lib au format OMF en utilisant Coff2Omf.exe en premier.

  2. Si vous utilisez SWIG, il est facile de créer un « module d’extension » Python qui rendra les données et les méthodes de l’application disponibles pour Python. SWIG s’occupera de tous les détails ennuyeux pour vous. Le résultat est du code C que vous liez dans votre fichier.exe (!) Vous n’avez _pas_ besoin de créer un fichier DLL, et cela simplifie également la liaison.

  3. SWIG va créer une fonction d’initialisation (fonction en C) dont le nom dépend du nom du module d’extension. Par exemple, si le nom du module est leo, la fonction init sera appelée initleo(). Si vous utilisez des classes shadow SWIG, comme vous le devriez, la fonction init sera appelée initleoc(). Ceci initialise une classe auxiliaire invisible utilisée par la classe shadow.

    La raison pour laquelle vous pouvez lier le code C à l’étape 2 dans votre fichier.exe est que l’appel de la fonction d’initialisation équivaut à importer le module dans Python ! (C’est le deuxième fait clé non documenté.)

  4. En bref, vous pouvez utiliser le code suivant pour initialiser l’interpréteur Python avec votre module d’extension.

    #include "python.h"
    ...
    Py_Initialize();  // Initialize Python.
    initmyAppc();  // Initialize (import) the helper class.
    PyRun_SimpleString("import myApp");  // Import the shadow class.
    
  5. Il y a deux problèmes avec l’API C de Python qui apparaîtront si vous utilisez un compilateur autre que MSVC, le compilateur utilisé pour construire pythonNN.dll.

    Problème 1 : Les fonctions dites de « Très Haut Niveau » qui prennent les arguments FILE * ne fonctionneront pas dans un environnement multi-compilateur car chaque compilateur aura une notion différente de la structure de FILE. Du point de vue de l’implémentation, il s’agit de fonctions de très bas niveau.

    Problème 2 : SWIG génère le code suivant lors de la génération d’encapsuleurs pour annuler les fonctions :

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

    Hélas, Py_None est une macro qui se développe en référence à une structure de données complexe appelée _Py_NoneStruct dans pythonNN.dll. Encore une fois, ce code échouera dans un environnement multi-compilateur. Remplacez ce code par :

    return Py_BuildValue("");
    

    Il est possible d’utiliser la commande %typemap de SWIG pour effectuer le changement automatiquement, bien que je n’ai pas réussi à le faire fonctionner (je suis un débutant complet avec SWIG).

  6. Utiliser un script shell Python pour créer une fenêtre d’interpréteur Python depuis votre application Windows n’est pas une bonne idée ; la fenêtre résultante sera indépendante du système de fenêtrage de votre application. Vous (ou la classe wxPythonWindow) devriez plutôt créer une fenêtre d’interpréteur « native ». Il est facile de connecter cette fenêtre à l’interpréteur Python. Vous pouvez rediriger l’entrée/sortie de Python vers n’importe quel objet qui supporte la lecture et l’écriture, donc tout ce dont vous avez besoin est un objet Python (défini dans votre module d’extension) qui contient les méthodes read() et write().

Comment empêcher mon éditeur d’utiliser des tabulations dans mes fichiers Python ?

La FAQ ne recommande pas l’utilisation des indentations et le guide stylistique de Python, la PEP 8, recommande l’utilisation de 4 espaces dans les codes Python. C’est aussi le comportement par défaut d’Emacs avec Python.

Quel que soit votre éditeur, mélanger des tabulations et des espaces est une mauvaise idée. Visual C++, par exemple, peut être facilement configuré pour utiliser des espaces : allez dans Tools ‣ Options ‣ Tabs et pour le type de fichier par défaut, vous devez mettre Tab size et Indent size à 4, puis sélectionner Insert spaces.

If you suspect mixed tabs and spaces are causing problems in leading whitespace, run Python with the -t switch or run the tabnanny module to check a directory tree in batch mode.

Comment puis-je vérifier de manière non bloquante qu’une touche a été pressée ?

Utilisez le module msvcrt. C’est une extension standard spécifique à Windows, qui définit une fonction kbhit() qui vérifie si une pression de touche s’est produite, et getch() qui récupère le caractère sans l’afficher.

How do I emulate os.kill() in Windows?

Prior to Python 2.7 and 3.2, to terminate a process, you can use ctypes:

import ctypes

def kill(pid):
    """kill function for Win32"""
    kernel32 = ctypes.windll.kernel32
    handle = kernel32.OpenProcess(1, 0, pid)
    return (0 != kernel32.TerminateProcess(handle, 0))

In 2.7 and 3.2, os.kill() is implemented similar to the above function, with the additional feature of being able to send Ctrl+C and Ctrl+Break to console subprocesses which are designed to handle those signals. See os.kill() for further details.

Comment décompresser la documentation téléchargée sous Windows ?

Quelquefois, lorsque vous téléchargez de la documentation avec Windows en utilisant un navigateur internet, l’extension du fichier est .EXE. Il s’agit d’une erreur ; l’extension devrait être .TGZ.

Renommez simplement le fichier téléchargé pour lui donner l’extension .TGZ, puis utilisez WinZip pour le décompresser. Si WinZip ne peut pas décompresser le fichier, téléchargez une version plus à jour (https://www.winzip.com).