2009-06-21 17 views
51

Comment puis-je utiliser l'API win32 en Python?
Quelle est la meilleure et la plus simple façon de le faire?
Pouvez-vous s'il vous plaît fournir quelques exemples?Comment utiliser les API win32 avec python?

+4

Je me demandais, avez-vous recherche à tout? http://www.google.com/search?q=python+win32+api –

+7

oui, je l'ai fait avant de poser la question, et j'ai trouvé plusieurs résultats. mon but est de commencer à apprendre la solution la plus recommandée à mon problème. d'ailleurs, pas une telle question n'a été posée en débordement de pile avant, donc je pensais que les bonnes réponses des programmeurs plus expérimentés peuvent montrer le bon chemin à prendre pour les débutants comme moi =) – kolistivra

+11

J'ai googlé et suivi les liens et je ne sais toujours pas comment . – Nosredna

Répondre

36

PyWin32 est le chemin à parcourir - 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 installation de Python 2.5 (ActiveState sous Windows), le paquetage win32 contient un dossier Demos contenant 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). De cet exemple, vous pouvez avoir une «idée générale» de la façon de travailler avec cette bibliothèque.

+3

Remarque sur le style: 3 'open (fn, 'w'). Write ('data')' les lignes dans CPython communiquent le même message que les lignes 9 'open, write, close'. – jfs

20

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 module-handle du module en cours (EXE ou DLL). Un exemple plus complet d'utilisation de ctypes pour obtenir les API win32 est here.

+3

Le lien vers l'exemple ne fonctionne pas pour moi. –

+0

@RadimCernej: Essayez une recherche google pour 'import ctypes github'. Vous obtiendrez de nombreux hits. Ou essayez cet exemple sur GitHub qui utilise 'from ctypes import *': https://github.com/erochest/snippets/blob/master/win32named.py – kevinarpe

+0

Ils n'ont pas eu pyWin32 pour fonctionner avec la version MSYS2 de Python. CTypes fait. –

4

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

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) 
Questions connexes