2009-06-21 23 views
51

Jak mogę używać API win32 w Pythonie?
Jaki jest najlepszy i najprostszy sposób to zrobić?
Czy możesz podać kilka przykładów?Jak korzystać z API Win32 z pythonem?

+4

prostu zastanawiasz się, czy szukaj w ogóle? http://www.google.com/search?q=python+win32+api –

+7

tak, faktycznie zrobiłem to przed zadaniem pytania i znalazłem kilka wyników. moim celem jest rozpoczęcie nauki najbardziej zalecanego rozwiązania mojego problemu. poza tym, nie zadawano już takiego pytania w stosie przepełnienia stosu, więc pomyślałem, że dobre odpowiedzi od bardziej doświadczonych programistów mogą pokazać właściwą ścieżkę dla początkujących, takich jak ja =) – kolistivra

+11

Przeszukałem go i śledziłem linki, a nadal nie wiem jak . – Nosredna

Odpowiedz

36

PyWin32 jest drogą do zrobienia - ale jak z niego korzystać? Jednym podejściem jest rozpoczęcie konkretnego problemu i próba jego rozwiązania. PyWin32 udostępnia powiązania dla funkcji Win32 API, dla których istnieje wiele, i naprawdę musisz najpierw wybrać konkretny cel.

W mojej instalacji Pythona 2.5 (ActiveState na Windows) pakiet win32 zawiera folder Demos zapakowany w przykładowy kod różnych części biblioteki.

Na przykład, oto 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) 

To pokazuje, jak korzystać z funkcji CopyFileEx z kilku innych (takich jak GetTempPath i GetTempFileName). Z tego przykładu można uzyskać "ogólne odczucie" jak pracować z tą biblioteką.

+3

Uwaga dotycząca stylu: 3 'otwarte (fn, 'w'). Write ('dane')' linie w CPythonie przekazują ten sam komunikat co 9 'otwórz, napisz, zamknij' linie. – jfs

20

PyWin32, jak wspomina @chaos, jest prawdopodobnie najpopularniejszym wyborem; alternatywą jest ctypes, która jest częścią standardowej biblioteki Pythona. Na przykład print ctypes.windll.kernel32.GetModuleHandleA(None) wyświetli uchwyt modułu bieżącego modułu (EXE lub DLL). Bardziej obszernym przykładem użycia ctypów do uzyskania API win32 jest here.

+3

Link do przykładu nie działa dla mnie. –

+0

@RadimCernej: Wypróbuj wyszukiwarkę google dla 'import ctypes github'. Otrzymasz wiele trafień. Lub spróbuj tego przykładu na GitHub, który używa 'from ctypes import *': https://github.com/erochest/snippets/blob/master/win32named.py – kevinarpe

+0

Nie dostali pyWin32 do pracy z wersją Pythona MSYS2. Ma to miejsce w przypadku CTypes. –

4

Ważnymi funkcjami, które można stosować w Pythonie win32, są pola wiadomości, czyli klasyczny przykład OK lub Anuluj.

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



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

Kolekcja:

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)