FAQ : Python et Windows¶
Sommaire
- FAQ : Python et Windows
- Comment exécuter un programme Python sous Windows ?
- Comment rendre des scripts Python exécutables ?
- Pourquoi Python met-il du temps à démarrer ?
- Comment construire un exécutable depuis un script Python ?
- Est-ce qu’un fichier
*.pyd
est la même chose qu’une DLL ? - Comment puis-je intégrer Python dans une application Windows ?
- Comment empêcher mon éditeur d’utiliser des tabulations dans mes fichiers Python ?
- Comment puis-je vérifier de manière non bloquante qu’une touche a été pressée ?
- How do I emulate os.kill() in Windows?
- Comment décompresser la documentation téléchargée sous 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
. 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 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 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.
Peut-être avez-vous remarqué une nouvelle entrée dans votre menu Démarrer, comme :
, qui lance l’interpréteur dans une nouvelle fenêtre. Dans ce cas, la fenêtre disparaîtra lorsque vous entrerez Ctrl-Z ; la fenêtre Python ouverte par Windows est fermée lorsque vous quittez l’interpréteur.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:\Python33
. Otherwise you will be reduced to a search of your whole
disk … use or hit the Search
button and look for « python.exe ». Supposing you discover that Python is
installed in the C:\Python33
directory (the default at the time of writing),
you should make sure that entering the command
c:\Python33\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 3.3.
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://cx-freeze.sourceforge.net/ for a distutils extension that allows you to create console and GUI executables from Python code. py2exe, the most popular extension for building Python 2.x-based executables, does not yet support Python 3 but a version that does is in development.
Est-ce qu’un fichier *.pyd
est la même chose qu’une DLL ?¶
Oui, les fichiers .pyd sont des fichiers dll, mais il y a quelques différences. Si vous avez une DLL foo.pyd
, celle-ci doit posséder une fonction PyInit_foo()
. Vous pouvez alors écrire en Python « import foo » et Python recherchera le fichier foo.pyd (ainsi que foo.py et foo.pyc); s’il le trouve, il tentera d’appeler PyInit_foo()
pour l’initialiser. Ne liez pas votre .exe avec foo.lib car dans ce cas Windows aura besoin de la DLL.
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 :
Ne compilez _pas_ Python directement dans votre fichier .exe. Sous Windows, Python doit être une DLL pour pouvoir importer des modules qui sont eux-mêmes des DLL (ceci constitue une information de première importance non documentée). Au lieu de cela faites un lien vers
pythonNN.dll
qui est généralement placé dansC:\Windows\System
. NN étant la version Python, par exemple « 33 » pour Python 3.3.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 verspythonNN.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 WindowsLoadLibraryEx()
. Le code doit aussi utiliser des routines d’accès et des données danspythonNN.dll
(c’est-à-dire les API C de Python) en utilisant des pointeurs obtenus par la routine WindowsGetProcAddress()
. 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.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.
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é.)
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.
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).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
et pour le type de fichier par défaut, vous devez mettre Tab size et Indent size à 4, puis sélectionner Insert spaces.Python raises IndentationError
or TabError
if mixed tabs
and spaces are causing problems in leading whitespace.
You may also 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).