Contrôler Windows avec Python —

Dans cette astuce rapide, extraite de Python utileStuart étudie les moyens de contrôler le système d’exploitation Windows avec Python.
Le registre Windows
Windows est entièrement contrôlable à partir du code à l’aide de l’API Win32, et Microsoft fournit une documentation complète sur Documents Microsoft pour tout ce que Windows peut faire par programmation. Tout cela est également accessible à partir de Python, même si cela peut sembler un peu impénétrable si nous ne sommes pas déjà habitués au mode de fonctionnement particulier de l’API Win32. Heureusement, il existe différents wrappers pour ces API de bas niveau afin de faciliter l’écriture du code pour les programmeurs Python.
Un exemple simple consiste à interagir avec le registre Windows. Python inclut en fait le winreg module pour le faire hors de la boîte, donc aucune installation supplémentaire n’est requise. Par exemple, vérifions où se trouve le Program Files
dossier vit réellement :
>>> import winreg
>>> hive = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE)
>>> key = winreg.OpenKey(hive, r"SOFTWARE\Microsoft\Windows\CurrentVersion")
>>> value, type = winreg.QueryValueEx(key, "ProgramFilesDir")
>>> value
'C:\\Program Files'
Cordes brutes
Dans le code ci-dessus, nous utilisons des « chaînes brutes » pour spécifier le nom de la clé :
r"SOFTWARE\Microsoft\Windows\CurrentVersion"
Les chaînes transmises à l’API Win32 incluent souvent le caractère barre oblique inverse (\
), car Windows l’utilise dans les chemins de fichiers et les chemins de registre pour séparer un répertoire du suivant.
Cependant, Python utilise une barre oblique inverse comme caractère d’échappement pour permettre l’ajout de caractères spéciaux non typables à une chaîne. Par exemple, la chaîne Python "first line\nsecond line"
est une chaîne contenant un caractère de saut de ligne, de sorte que le texte s’étale sur deux lignes. Cela entrerait en conflit avec le caractère du chemin Windows : un chemin de fichier tel que "C:\newdir\myfile.txt"
aurait le \n
interprété comme une nouvelle ligne.
Chaînes brutes éviter ceci : préfixer une chaîne Python avec r
supprime la signification particulière d’une barre oblique inverse, de sorte que r"C:\newdir\myfile.txt"
est interprété comme prévu. Nous pouvons voir que les barres obliques inverses sont traitées spécialement par la valeur que nous récupérons pour l’emplacement du dossier : il est imprimé comme 'C:\\Program Files'
– avec la barre oblique inverse doublée pour supprimer sa signification particulière – mais c’est ainsi que Python l’imprime plutôt que la valeur réelle. Python aurait pu imprimer cela comme r'C:\Program Files'
plutôt.
L’API Windows
Lire le registre (et plus encore, y écrire) est la source d’un millier de piratages sur les pages Web (dont beaucoup sont anciens, ne devraient pas être liés et utilisent l’ancien REGEDT32.EXE
), mais il est préférable d’utiliser l’API pour cela. (Raymond Chen a écrit de nombreux longues histoires tristes pourquoi nous devrions utiliser l’API et non le registre.) Comment utiliserions-nous l’API Win32 de Python pour résoudre ce problème ?
L’API Python Win32 est disponible dans le PyWin32 module, qui peut être obtenu avec python -m pip install pywin32
. Le Documentation pour le module est plutôt clairsemé, mais l’idée de base est que la plupart de l’API Windows Shell (qui concerne la configuration du système d’exploitation Windows) est disponible dans le win32com.shell
emballer. Pour connaître l’emplacement du Program Files
dossier, MSDN montre que nous avons besoin du Fonction SHGetKnownFolderPathauquel est passé un ID DE DOSSIER CONNU constante et un indicateur défini sur 0
. Les constantes du shell sont disponibles pour Python dans win32com.shell.shellcon
(pour « shell constants »), ce qui signifie que trouver les Program Files
dossier ne nécessite qu’une seule ligne (certes complexe):
>>> from win32com.shell import shell, shellcon
>>> shell.SHGetKnownFolderPath(shellcon.FOLDERID_ProgramFiles, 0)
"C:\\Program Files"
Creuser dans les profondeurs de l’API Win32 nous donne accès à tout ce à quoi nous pouvons vouloir accéder dans Windows (y compris Windows !), mais comme nous l’avons vu, il peut être assez compliqué de savoir comment faire ce dont nous avons besoin, puis de traduire ce besoin en Python. Heureusement, il existe des bibliothèques wrapper pour de nombreuses fonctions couramment utilisées. Un bon exemple est PyGetWindow, qui nous permet d’énumérer et de contrôler les fenêtres à l’écran. (Il prétend être multiplateforme, mais il ne fonctionne en fait que sur Windows. Mais c’est tout ce dont nous avons besoin ici.)
Nous pouvons installer PyGetWindow avec python -m pip install pygetwindow
puis listez toutes les fenêtres à l’écran et manipulez-les :
>>> import pygetwindow as gw
>>> allMSEdgeWindows = gw.getWindowsWithTitle("edge")
>>> allMSEdgeWindows
[Win32Window(hWnd=197414), Win32Window(hWnd=524986)]
>>> allMSEdgeWindows[0].title
'pywin32 · PyPI - Microsoft Edge'
>>> allMSEdgeWindows[1].title
'Welcome to Python.org - Microsoft Edge'
Ces fenêtres peuvent être contrôlées. Un objet fenêtre peut être minimisé et restauré, ou redimensionné et déplacé sur l’écran, et focalisé et amené au premier plan :
>>> pythonEdgeWindow = allMSEdgeWindows[1]
>>> pythonEdgeWindow.minimize()
>>> pythonEdgeWindow.restore()
>>> pythonEdgeWindow.size
Size(width=1050, height=708)
>>> pythonEdgeWindow.topleft
Point(x=218, y=5)
>>> pythonEdgeWindow.resizeTo(800, 600)
Il vaut toujours la peine de rechercher sur PyPI des modules wrapper qui fournissent une API plus pratique pour tout ce que nous essayons de faire avec Windows ou avec Windows. Mais si besoin est, nous avons accès à toute l’API Win32 de Python, et cela nous permettra de faire tout ce que nous pouvons penser.
Cet article est extrait de Python utiledisponible sur SitePoint Premium et auprès des revendeurs de livres numériques.
Source link