2009-06-21 14 views
51

¿Cómo puedo usar la API de Win32 en Python?
¿Cuál es la mejor y más fácil forma de hacerlo?
¿Podría darnos algunos ejemplos?¿Cómo usar las API de win32 con python?

+4

Sólo me preguntaba, ¿Ha buscado en absoluto? http://www.google.com/search?q=python+win32+api –

+7

sí, en realidad lo hice antes de hacer la pregunta y encontré varios resultados. mi objetivo es comenzar a aprender la solución más recomendada para mi problema. además, esa pregunta no se ha hecho antes en desbordamiento de pila, así que pensé que las buenas respuestas de programadores más experimentados pueden mostrar el camino correcto para principiantes como yo =) – kolistivra

+11

Busqué en Google y seguí los enlaces y todavía no sé cómo . – Nosredna

Respuesta

36

PyWin32 es el camino a seguir, pero ¿cómo usarlo? Un enfoque es comenzar con un problema concreto que tenga y tratar de resolverlo. PyWin32 proporciona enlaces para las funciones de API de Win32 para los que hay muchos, y realmente tiene que elegir un objetivo específico primero.

En mi instalación de Python 2.5 (ActiveState en Windows) el paquete win32 tiene una carpeta Demos empaquetada con código de muestra de varias partes de la biblioteca.

Por ejemplo, aquí está 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) 

Se muestra cómo utilizar la función CopyFileEx con algunos otros (como GetTempPath y GetTempFileName). A partir de este ejemplo, puede obtener una "sensación general" de cómo trabajar con esta biblioteca.

+3

Comentario de estilo: 3 líneas 'open (fn, 'w'). Write ('data')' en CPython comunican el mismo mensaje que 9 líneas 'abrir, escribir, cerrar'. – jfs

20

PyWin32, mencionado por @ chaos, es probablemente la opción más popular; la alternativa es ctypes que es parte de la biblioteca estándar de Python. Por ejemplo, print ctypes.windll.kernel32.GetModuleHandleA(None) mostrará el módulo de manejo del módulo actual (EXE o DLL). Un ejemplo más extenso del uso de ctypes para obtener las API de win32 es here.

+3

El enlace al ejemplo no funciona para mí. –

+0

@RadimCernej: Pruebe una búsqueda en Google de 'import ctypes github'. Obtendrás muchos éxitos. O pruebe este ejemplo en GitHub que usa 'from ctypes import *': https://github.com/erochest/snippets/blob/master/win32named.py – kevinarpe

+0

No han conseguido que pyWin32 funcione con la versión MSYS2 de Python. CTypes lo hace. –

4

Las funciones importantes que puede utilizar en win32 Python son los cuadros de mensaje, este es el ejemplo clásico de Aceptar o Cancelar.

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



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

La colección:

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)