2010-10-04 1 views
15

Как я могу получить специальные папки Windows, такие как My Documents, Desktop и т. Д. Из моего сценария Python? Мне нужны расширения win32?Python, получить специальные папки для Windows для текущего зарегистрированного пользователя

Она должна работать на Windows 2000 для Windows, 7.

+0

связанные: [Поиск местоположения системных папок в Python] (http://stackoverflow.com/q/2063508/4279) – jfs

ответ

15

Вы можете сделать это с расширениями 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) 

Проверить shellcon.CSIDL_xxx для других возможных папок.

Я думаю, что использование pywin32 - лучший способ. Кроме того, вам нужно будет использовать ctypes для доступа к функции SHGetFolderPath (возможно, возможны другие решения, но это те, которые я знаю).

+1

Спасибо! Что такое оболочка в окнах и что такое shellcon? – Primoz

+0

@ Primoz: Я не знаю, что означают сокращения, но все модули * con в пакете pywin32 автоматически генерируются из файлов заголовков Windows и содержат только определения. Модуль 'win32com.shell' содержит функции из shell32.dll. – AndiDog

+0

В документах упоминаются константы 'SHGFP_TYPE_CURRENT' и' SHGFP_TYPE_DEFAULT' для последнего параметра 'SHGetFolderPath()', но они не определены в 'shellcon' по какой-то причине ... Интересно, почему нет. –

4

Попробуйте winshell (сделано именно для этой цели):

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

Это всего лишь обертка вокруг pywin32, и если мне нужно pywin32, я скорее использовал ее без другого слоя. – Primoz

+0

Смешно простой и понятный - и поэтому красивый. – ChaimG

14

Если вы хотите сделать это без расширений win32, вы можете использовать ctypes позвонить 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

-Very- полезный. Спасибо. – HardlyKnowEm

+1

Ваш код (также) иллюстрирует одно из ограничений использования 'ctypes' вместо расширений' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' - поэтому нужно искать их значения и добавлять каждый из них вручную. – martineau

+0

Хорошее решение. И работаю над моей Windows 8. Однако MS Doc (http://msdn.microsoft.com/en-us/library/bb762181%28VS.85%29.aspx) говорит, что он «устарел». Я не уверен, каковы последствия ... – Zvika

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