2010-10-04 10 views

Odpowiedz

15

Można to zrobić z rozszerzeniami 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) 

Sprawdź inne możliwe foldery pod numerem shellcon.CSIDL_xxx.

Myślę, że używanie pywin32 to najlepszy sposób. Inaczej musiałbyś użyć ctypes, aby uzyskać jakoś dostęp do funkcji SHGetFolderPath (inne rozwiązania mogą być możliwe, ale to są te, które znam).

+1

Dzięki! Czym dokładnie jest powłoka w oknach i czym jest shellcon? – Primoz

+0

@Primoz: Nie wiem, co oznaczają skróty, ale wszystkie * moduły con w pakiecie pywin32 są automatycznie generowane z plików nagłówkowych Windows i zawierają tylko definicje. Moduł 'win32com.shell' zawiera funkcje z powłoki shell32.dll. – AndiDog

+0

Dokumenty wymieniają stałe 'SHGFP_TYPE_CURRENT' i' SHGFP_TYPE_DEFAULT' dla ostatniego parametru 'SHGetFolderPath()', ale nie są one zdefiniowane w 'shellcon' z jakiegoś powodu ... Zastanawiam się, dlaczego nie. –

4

Spróbuj winshell (wykonane dokładnie w tym celu):

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

To tylko opakowanie pywin32, a jeśli potrzebuję pywin32, raczej użyłem go bez innej warstwy. – Primoz

+0

Śmiesznie prosta i bezpośrednia - a zatem piękna. – ChaimG

14

Jeżeli chcesz to zrobić bez rozszerzeń Win32 można użyć ctypes zadzwonić 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

-Bardzo przydatne. Dziękuję Ci. – HardlyKnowEm

+1

Twój kod (także) ilustruje jedno z ograniczeń używania 'ctypes' zamiast rozszerzeń' win32', a mianowicie fakt, że ten pierwszy nie dostarcza żadnych często potrzebnych stałych Window, takich jak te zdefiniowane w 'win32com.shellcon' - więc trzeba sprawdzić ich wartości i dodać każdą z nich ręcznie. – martineau

+0

Ładne rozwiązanie. Pracuję też nad moim Windows 8. Jednak MS Doc (http://msdn.microsoft.com/en-us/library/bb762181%28VS.85%29.aspx) mówi, że jest "przestarzałe". Nie jestem pewien, jakie są implikacje ... – Zvika

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