web-dev-qa-db-fra.com

Comment utiliser les API win32 avec python?

Comment puis-je utiliser l'API win32 en Python?
Quelle est la manière la meilleure et la plus simple de le faire?
Pouvez-vous donner quelques exemples?

52
kolistivra

PyWin32 est la voie à suivre - mais comment l'utiliser? Une approche consiste à commencer par un problème concret que vous rencontrez et à tenter de le résoudre. PyWin32 fournit des liaisons pour les fonctions API Win32 pour lesquelles il y en a beaucoup, et vous devez d'abord choisir un objectif spécifique.

Dans mon Python 2.5 (ActiveState sur Windows), le package win32 a un dossier Demos emballé avec un exemple de code de différentes parties de la bibliothèque.

Par exemple, voici CopyFileEx.py:

import win32file, win32api
import os


def ProgressRoutine(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred,
    StreamNumber, CallbackReason, SourceFile, DestinationFile, Data):
    print Data
    print TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred, StreamNumber, CallbackReason, SourceFile, DestinationFile
    ##if TotalBytesTransferred > 100000:
    ##    return win32file.PROGRESS_STOP
    return win32file.PROGRESS_CONTINUE

temp_dir=win32api.GetTempPath()
fsrc=win32api.GetTempFileName(temp_dir,'cfe')[0]
fdst=win32api.GetTempFileName(temp_dir,'cfe')[0]
print fsrc, fdst

f=open(fsrc,'w')
f.write('xxxxxxxxxxxxxxxx\n'*32768)
f.close()
## add a couple of extra data streams
f=open(fsrc+':stream_y','w')
f.write('yyyyyyyyyyyyyyyy\n'*32768)
f.close()
f=open(fsrc+':stream_z','w')
f.write('zzzzzzzzzzzzzzzz\n'*32768)
f.close()

operation_desc='Copying '+fsrc+' to '+fdst
win32file.CopyFileEx(fsrc, fdst, ProgressRoutine, operation_desc, False,   win32file.COPY_FILE_RESTARTABLE)

Il montre comment utiliser la fonction CopyFileEx avec quelques autres (comme GetTempPath et GetTempFileName). À partir de cet exemple, vous pouvez avoir une "idée générale" de la façon de travailler avec cette bibliothèque.

37
Eli Bendersky

PyWin32, comme mentionné par @chaos, est probablement le choix le plus populaire; l'alternative est ctypes qui fait partie de la bibliothèque standard de Python. Par exemple, print ctypes.windll.kernel32.GetModuleHandleA(None) affichera le descripteur de module du module actuel (EXE ou DLL). Un exemple plus complet d'utilisation de ctypes pour obtenir les API win32 est ici .

23
Alex Martelli

Les fonctions importantes que vous pouvez utiliser dans win32 Python sont les boîtes de message, c'est un exemple classique de OK ou Cancel.

result = win32api.MessageBox(None,"Do you want to open a file?", "title",1)



  if result == 1:
     print 'Ok'
  Elif result == 2:
     print 'cancel'

La collection:

win32api.MessageBox(0,"msgbox", "title")
win32api.MessageBox(0,"ok cancel?", "title",1)
win32api.MessageBox(0,"abort retry ignore?", "title",2)
win32api.MessageBox(0,"yes no cancel?", "title",3)
5
Tabares