2010-10-04 24 views

Trả lời

15

Bạn có thể làm điều đó với các phần mở rộng 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) 

Kiểm tra shellcon.CSIDL_xxx để biết các thư mục có thể khác.

Tôi nghĩ sử dụng pywin32 là cách tốt nhất. Ngoài ra, bạn phải sử dụng ctypes để truy cập chức năng SHGetFolderPath bằng cách nào đó (các giải pháp khác có thể thực hiện được nhưng đây là những giải pháp mà tôi biết).

+1

Cảm ơn! Vỏ chính xác trong cửa sổ là gì và shellcon là gì? – Primoz

+0

@ Primoz: Tôi không biết chữ viết tắt có ý nghĩa gì, nhưng tất cả * mô-đun con trong gói pywin32 được tự động phát từ các tệp tiêu đề Windows và chỉ chứa các định nghĩa. Mô-đun 'win32com.shell' chứa các hàm từ shell32.dll. – AndiDog

+0

Các tài liệu đề cập đến hằng số 'SHGFP_TYPE_CURRENT' và' SHGFP_TYPE_DEFAULT' cho tham số cuối cùng của 'SHGetFolderPath()', nhưng chúng không được định nghĩa trong 'shellcon' vì lý do nào đó ... Tôi tự hỏi tại sao không. –

4

Hãy thử winshell (thực hiện chính xác cho mục đích này):

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

Nó chỉ là một wrapper xung quanh pywin32, và nếu tôi cần pywin32, tôi thay vì sử dụng nó mà không có một lớp. – Primoz

+0

Vô cùng đơn giản và dễ hiểu - và do đó đẹp. – ChaimG

14

Nếu bạn muốn làm điều đó mà không có phần mở rộng win32, bạn có thể sử dụng ctypes gọi 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

-Rất hữu ích. Cảm ơn bạn. – HardlyKnowEm

+1

Mã của bạn (cũng) minh họa một trong những hạn chế của việc sử dụng 'ctypes' thay vì phần mở rộng' win32', cụ thể là trước đây không cung cấp bất kỳ hằng số Window cần thiết nào như các giá trị được định nghĩa trong 'win32com.shellcon' - vì vậy người ta phải tra cứu giá trị của chúng và thêm từng giá trị theo cách thủ công. – martineau

+0

Giải pháp tốt. Và làm việc trên Windows của tôi 8. Tuy nhiên, MS Doc (http://msdn.microsoft.com/en-us/library/bb762181%28VS.85%29.aspx) nói rằng đó là 'deprecated'. Tôi không chắc ý nghĩa của nó là gì ... – Zvika

3
import win32com.client 
oShell = win32com.client.Dispatch("Wscript.Shell") 
print oShell.SpecialFolders("Desktop") 
Các vấn đề liên quan