2009-06-21 18 views
51

Come posso utilizzare l'API win32 in Python?
Qual è il modo migliore e più semplice per farlo?
Potete per favore fornire alcuni esempi?Come utilizzare le API win32 con python?

+4

Chiedo solo, ha fatto si cerca a tutti? http://www.google.com/search?q=python+win32+api –

+7

sì, l'ho effettivamente fatto prima di porre la domanda e ho trovato diversi risultati. il mio obiettivo è iniziare ad apprendere la soluzione più consigliata per il mio problema. inoltre, non è tale domanda è stata fatta in overflow dello stack prima, così ho pensato buone risposte dai programmatori più esperti in grado di mostrare la strada giusta da prendere per i principianti come me =) – kolistivra

+11

Ho cercato su google e seguito i link e io ancora non so come . – Nosredna

risposta

36

PyWin32 è la strada da percorrere, ma come utilizzarlo? Un approccio è iniziare con un problema concreto che stai affrontando e tentando di risolverlo. PyWin32 fornisce i collegamenti per le funzioni dell'API Win32 per le quali ce ne sono molti e devi davvero scegliere prima un obiettivo specifico.

Nel mio Python 2.5 installazione (ActiveState su Windows) il pacchetto di Win32 ha una cartella Demos imballato con codice di esempio di varie parti della libreria.

Ad esempio, ecco 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) 

Essa mostra come utilizzare la funzione CopyFileEx a pochi altri (come GetTempPath e GetTempFileName). Da questo esempio è possibile ottenere una "sensazione generale" su come lavorare con questa libreria.

+3

Commento di stile: le linee 3 'open (fn, 'w'). Write ('data') in CPython comunicano lo stesso messaggio di 9 righe 'apri, scrivi, chiudi'. – jfs

20

PyWin32, come indicato da @chaos, è probabilmente la scelta più popolare; l'alternativa è ctypes che fa parte della libreria standard di Python. Ad esempio, print ctypes.windll.kernel32.GetModuleHandleA(None) mostrerà l'handle del modulo del modulo corrente (EXE o DLL). Un esempio più ampio di utilizzo di ctype per ottenere le API win32 è here.

+3

Il collegamento all'esempio non funziona per me. –

+0

@RadimCernej: prova una ricerca su google per l'importazione di github di tipi. Otterrai molti successi. Oppure provate questo esempio su GitHub che utilizza 'da ctypes import *': https://github.com/erochest/snippets/blob/master/win32named.py – kevinarpe

+0

Essi non hanno ottenuto pyWin32 a lavorare con la build MSYS2 di Python. CTypes fa. –

4

Le funzioni importanti che è possibile per l'utilizzo in Win32 Python sono le finestre di messaggio, questo è classico esempio di OK o Annulla.

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



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

La collezione:

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) 
Problemi correlati