2010-10-04 4 views

risposta

15

si può fare con le estensioni 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) 

Controllare shellcon.CSIDL_xxx per altre cartelle possibili.

Penso che l'uso di pywin32 sia il modo migliore. Altrimenti dovresti usare ctypes per accedere in qualche modo alla funzione SHGetFolderPath (altre soluzioni potrebbero essere possibili ma queste sono quelle che conosco).

+1

Grazie! Che cosa è esattamente la shell in Windows e cos'è lo shell? – Primoz

+0

@Primoz: non so cosa significino le abbreviazioni, ma tutti i moduli di con * nel pacchetto pywin32 sono generati da file di intestazione di Windows e contengono solo definizioni. Il modulo 'win32com.shell' contiene funzioni da shell32.dll. – AndiDog

+0

I documenti menzionano costanti 'SHGFP_TYPE_CURRENT' e' SHGFP_TYPE_DEFAULT' per l'ultimo parametro di 'SHGetFolderPath()', ma questi non sono definiti in 'shellcon' per qualche motivo ... Mi chiedo perché no. –

4

Prova winshell (fatta esattamente per questo scopo):

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

È solo un wrapper attorno a pywin32 e, se ho bisogno di pywin32, l'ho usato piuttosto senza un altro livello. – Primoz

+0

Ridicolmente semplice e diretto - e quindi bello. – ChaimG

14

Se si desidera realizzare farlo senza le estensioni Win32, è possibile utilizzare per chiamare ctypesSHGetFolderPath:

>>> 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

-Molto utile. Grazie. – HardlyKnowEm

+1

Il tuo codice (anche) illustra uno dei limiti dell'uso di 'ctype' invece delle estensioni' win32', vale a dire il fatto che il primo non fornisce alcuna delle costanti di Window spesso necessarie come quelle definite in 'win32com.shellcon' - quindi bisogna cercare i loro valori e aggiungerli manualmente. – martineau

+0

Bella soluzione. E lavorando sul mio Windows 8. Tuttavia, il documento MS (http://msdn.microsoft.com/en-us/library/bb762181%28VS.85%29.aspx) dice che è "deprecato". Non sono sicuro di quali sono le implicazioni ... – Zvika

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