Как я нахожу папку данных распространенного приложения Windows с помощью Python?

Я хотел бы, чтобы мое приложение хранило некоторые данные для доступа всеми пользователями. Используя Python, как я могу найти, куда данные должны пойти?

29
задан jfs 25 August 2012 в 01:47
поделиться

5 ответов

Если бы Вы не хотите добавлять зависимость для стороннего модуля как winpaths, я рекомендовал бы использовать переменные среды, уже доступные в Windows:

Конкретно Вы, вероятно, хотите ALLUSERSPROFILE получить местоположение папки профиля обычного пользователя, которая является, где Каталог данных приложения находится.

, например:

C:\> python -c "import os; print os.environ['ALLUSERSPROFILE']"
C:\Documents and Settings\All Users

РЕДАКТИРОВАНИЕ : Смотря на winpaths модуль, это использует ctypes поэтому, если Вы хотели просто использовать соответствующую часть кода, не устанавливая winpath, можно использовать это (очевидно, некоторая проверка ошибок, опущенная для краткости).

import ctypes
from ctypes import wintypes, windll

CSIDL_COMMON_APPDATA = 35

_SHGetFolderPath = windll.shell32.SHGetFolderPathW
_SHGetFolderPath.argtypes = [wintypes.HWND,
                            ctypes.c_int,
                            wintypes.HANDLE,
                            wintypes.DWORD, wintypes.LPCWSTR]


path_buf = wintypes.create_unicode_buffer(wintypes.MAX_PATH)
result = _SHGetFolderPath(0, CSIDL_COMMON_APPDATA, 0, 0, path_buf)
print path_buf.value

выполненный Пример:

C:\> python get_common_appdata.py
C:\Documents and Settings\All Users\Application Data
39
ответ дан Jay 28 November 2019 в 01:09
поделиться

Смотрите на http://ginstrom.com/code/winpaths.html . Это - простой модуль, который получит информацию о папке Windows. Реализации модуля get_common_appdata для получения папки App Data для всех пользователей.

10
ответ дан Robert S. 28 November 2019 в 01:09
поделиться

Можно получить доступ ко всем переменным среды ОС с помощью os.environ словарь в os модуль. Выбор, какой ключ использовать из того словаря мог быть хитрым, все же. В частности, необходимо остаться знать интернационализировавший (т.е. неанглийский язык) версии Windows при использовании этих путей.

os.environ['ALLUSERSPROFILE'] должен дать Вам корневой каталог для всех пользователей на компьютере, но после этого бояться трудно кодировать имена подкаталога как "Данные приложения", потому что эти каталоги не существуют на неанглийских версиях Windows. В этом отношении можно хотеть провести некоторое исследование на том, какие версии Windows можно ожидать иметь набор переменной среды ALLUSERSPROFILE (я не знаю меня - это может быть универсально).

Моя машина XP здесь имеет переменную среды COMMONAPPDATA, которая указывает на папку All Users\Application Data, но моя система Win2K3 не имеет этой переменной среды.

3
ответ дан Jeff 28 November 2019 в 01:09
поделиться

Предыдущий ответ, удаленный из-за несовместимости с неамериканскими версиями Windows и Vista.

РЕДАКТИРОВАНИЕ: , Чтобы подробно остановиться В ответ Пространства, Вы использовали бы эти winpaths.get_common_appdata функция. Можно получить winpaths использование easy_install winpaths или путем движения в pypi страницу, http://pypi.python.org/pypi/winpaths/ , и загрузки .exe установщика.

3
ответ дан tgray 28 November 2019 в 01:09
поделиться

Из http://snipplr.com/view.php?codeview&id=7354

homedir = os.path.expanduser('~')

# ...works on at least windows and linux. 
# In windows it points to the user's folder 
#  (the one directly under Documents and Settings, not My Documents)


# In windows, you can choose to care about local versus roaming profiles.
# You can fetch the current user's through PyWin32.
#
# For example, to ask for the roaming 'Application Data' directory:
#  (CSIDL_APPDATA asks for the roaming, CSIDL_LOCAL_APPDATA for the local one)
#  (See microsoft references for further CSIDL constants)
try:
    from win32com.shell import shellcon, shell            
    homedir = shell.SHGetFolderPath(0, shellcon.CSIDL_APPDATA, 0, 0)

except ImportError: # quick semi-nasty fallback for non-windows/win32com case
    homedir = os.path.expanduser("~")

Чтобы получить каталог данных приложения для всех пользователей, а не для текущего пользователя, просто используйте shellcon.CSIDL_COMMON_APPDATA вместо shellcon.CSIDL_APPDATA .

13
ответ дан 28 November 2019 в 01:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: