Вы решаете эту проблему так же, как и эту: сначала вы находите документацию и, в идеале, хороший пример кода на C ++, C # или VB, затем вы выясняете, как использовать PyWin32 для выполнения того же API оболочки или IKnownFolder
COM-вызовов из Python. .
В качестве обзорной документации MSDN по Известные папки говорит, что вы можете использовать новую функцию оболочки _ 2_ вместо старого SHFolderPath
или SHGetFolderPath
, или вы можете использовать полный _ 5_ через COM.
К сожалению, передо мной нет компьютера с Windows, и образцы загрузки MSDN не отвечают, поэтому мне придется немного гадать. Но может быть примерно так:
from win32com.shell import shell, shellcon
path = shell.SHGetKnownFolderPath(shellcon.FOLDERID_AccountPictures,
0, # see KNOWN_FOLDER_FLAG
0) # current user
Если shellcon
не имеет значений FOLDERID
, вам нужно будет найти их в _ 9_ и определите необходимые вам константы.
Если shell
не имеет функции SHGetKnownFolderPath
, вам придется создать экземпляр IKnownFolderManager
и вызвать GetFolderByName
.
Если shell
даже не IKnownFolderManager
… но быстрый Google показывает это был добавлен в сборку 218, так что это не будет проблемой.
Если вы предпочитаете делать это через ctypes
, а не через win32com
, это будет выглядеть примерно так (опять же, непроверено, потому что у меня нет окна Windows и сервер MSDN сломан):
from ctypes import windll, wintypes
from ctypes import *
from uuid import UUID
# ctypes GUID copied from MSDN sample code
class GUID(Structure):
_fields_ = [
("Data1", wintypes.DWORD),
("Data2", wintypes.WORD),
("Data3", wintypes.WORD),
("Data4", wintypes.BYTE * 8)
]
def __init__(self, uuidstr):
uuid = UUID(uuidstr)
Structure.__init__(self)
self.Data1, self.Data2, self.Data3, self.Data4[0], self.Data4[1], rest = uuid.fields
for i in range(2, 8):
self.Data4[i] = rest>>(8-i-1)*8 & 0xff
FOLDERID_AccountPictures = '{008ca0b1-55b4-4c56-b8a8-4de4b299d3be}'
SHGetKnownFolderPath = windll.shell32.SHGetKnownFolderPath
SHGetKnownFolderPath.argtypes = [
POINTER(GUID), wintypes.DWORD, wintypes.HANDLE, POINTER(c_char_p)]
def get_known_folder_path(uuidstr):
pathptr = c_wchar_p()
guid = GUID(uuidstr)
if SHGetKnownFolderPath(byref(guid), 0, 0, byref(pathptr)):
raise Exception('Whatever you want here...')
return pathptr.value
person
abarnert
schedule
27.04.2015