2010-10-04 27 views

Respuesta

15

Usted puede hacerlo con las extensiones pywin32:

from win32com.shell import shell, shellcon 
print shell.SHGetFolderPath(0, shellcon.CSIDL_MYPICTURES, None, 0) 
# prints something like C:\Documents and Settings\Username\My Documents\My Pictures 
# (Unicode object) 

Compruebe shellcon.CSIDL_xxx para otras carpetas posibles.

Creo que el uso de pywin32 es la mejor manera. De lo contrario, tendría que usar ctypes para acceder a la función SHGetFolderPath de alguna manera (otras soluciones podrían ser posibles, pero estas son las que yo conozco).

+1

Gracias! ¿Qué es exactamente shell en windows y qué es shellcon? – Primoz

+0

@Primoz: no sé lo que significan las abreviaturas, pero todos los módulos * con en el paquete pywin32 se autogeneran desde los archivos de encabezado de Windows y solo contienen definiciones. El módulo 'win32com.shell' contiene funciones de shell32.dll. – AndiDog

+0

Los documentos mencionan las constantes 'SHGFP_TYPE_CURRENT' y' SHGFP_TYPE_DEFAULT' para el último parámetro de 'SHGetFolderPath()', pero por alguna razón no están definidos en 'shellcon' ... Me pregunto por qué no. –

4

Trate winshell (hecho precisamente para este propósito):

import winshell 

print 'Desktop =>', winshell.desktop() 
print 'Common Desktop =>', winshell.desktop (1) 
print 'Application Data =>', winshell.application_data() 
print 'Common Application Data =>', winshell.application_data (1) 
print 'Bookmarks =>', winshell.bookmarks() 
print 'Common Bookmarks =>', winshell.bookmarks (1) 
print 'Start Menu =>', winshell.start_menu() 
print 'Common Start Menu =>', winshell.start_menu (1) 
print 'Programs =>', winshell.programs() 
print 'Common Programs =>', winshell.programs (1) 
print 'Startup =>', winshell.startup() 
print 'Common Startup =>', winshell.startup (1) 
print 'My Documents =>', winshell.my_documents() 
print 'Recent =>', winshell.recent() 
print 'SendTo =>', winshell.sendto() 
+2

Es solo una envoltura alrededor de pywin32, y si necesito pywin32, prefiero usarlo sin otra capa. – Primoz

+0

Ridículamente simple y sencillo, y por lo tanto hermoso. – ChaimG

14

En caso de que deseen hacerlo sin las extensiones de Win32, puede utilizar ctypes llamar SHGetFolderPath:

>>> import ctypes.wintypes 
>>> CSIDL_PERSONAL= 5  # My Documents 
>>> SHGFP_TYPE_CURRENT= 0 # Want current, not default value 

>>> buf= ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) 
>>> ctypes.windll.shell32.SHGetFolderPathW(0, CSIDL_PERSONAL, 0, SHGFP_TYPE_CURRENT, buf) 
0 
>>> buf.value 
u'C:\\Documents and Settings\\User\\My Documents' 
+1

-Muy útil. Gracias. – HardlyKnowEm

+1

Su código (también) ilustra una de las limitaciones del uso de 'ctypes' en lugar de las extensiones' win32', es decir, el hecho de que el primero no proporciona ninguna de las constantes de Windows que a menudo se necesitan, como las definidas en 'win32com.shellcon' - entonces uno tiene que buscar sus valores y agregarlos manualmente. – martineau

+0

Buena solución. Y trabajando en mi Windows 8. Sin embargo, el MS Doc (http://msdn.microsoft.com/en-us/library/bb762181%28VS.85%29.aspx) dice que está 'obsoleto '. No estoy seguro de cuáles son las implicaciones ... – Zvika

3
import win32com.client 
oShell = win32com.client.Dispatch("Wscript.Shell") 
print oShell.SpecialFolders("Desktop") 
Cuestiones relacionadas