사용자의 프로필 폴더 (예 : 환경 변수) 또는 홈 폴더 (예 : "%HomeDrive%%HomePath%"
)에 직접 파일 및 디렉토리를 저장하지 않는 것이 좋습니다. 이것은 유닉스에서 홈 디렉토리 (XDG 기본 디렉토리 스펙을 무시하는 경우)의 일반적인 관행과 다르지만 레드먼드에서는 마이크로 소프트와 마찬가지입니다.
로컬 데이터 폴더 (사용자 별), 로밍 데이터 폴더 (사용자 별) 또는 프로그램 데이터 폴더 (사용자 별) 중 하나 이상에서 응용 프로그램에 대해 고유 한 폴더를 만듭니다. 기계). 이러한 폴더는 일반적으로 사용자가 직접 액세스하지 않으므로 기본적으로 숨겨져 있습니다.
캐시에는 로컬 데이터 폴더를 사용하십시오. 상태 저장 사용자 데이터 및 구성에는 로밍 데이터 폴더를 사용하십시오. 사용자와 관련이없는 데이터 및 캐시에는 프로그램 데이터 폴더를 사용하십시오. 예를 들어, pip와 같은 프로그램은 다운로드 한 패키지를 캐시하기 위해 프로그램 데이터 폴더를 사용할 수 있습니다. 실제적으로 pip는 사용자 당 패키지를 캐시하지만 원칙적으로 컴퓨터 당 캐시 할 수 있습니다.
응용 프로그램에서 프로그램 데이터 폴더를 사용하는 경우 폴더에서 모든 사용자에게 하위 폴더 및 파일을 추가하고 수정할 수있는 권한을 부여해야합니다. lazily 폴더를 만들면 수동으로 사용 권한을 추가 할 수 있습니다. 파일 보안을 수정하는 방법에 대한 예제는 this answer을 참조하십시오.
로컬, 로밍 및 프로그램 데이터 폴더의 환경 변수는 각각 LocalAppData
, AppData
및 ProgramData
입니다. Windows XP에서는 후자가 "%AllUsersProfile%\Application Data"
이고 "응용 프로그램 데이터"가 현지화되었을 수 있습니다. 일반적으로 응용 프로그램에서 이러한 환경 변수를 사용하면 안됩니다.
대부분의 알려진/특수 폴더는 Explorer에서 쉽게 재배치 가능하므로 환경 변수 및 기본 위치 대신 SHGetFolderPath
또는 최신 SHGetKnownFolderPath
함수를 호출하여 셸에 현재 경로를 요청하는 것이 가장 좋습니다. 파이썬의 표준 라이브러리에 있어야한다면 ctypes를 사용할 수있다. 그러나 PyWin32를 사용하는 것이 더 쉽습니다. PyWin32는 pip가 "pypiwin32"패키지로 설치 될 수 있습니다.
User System
ProgramData CSIDL_COMMON_APPDATA
Local CSIDL_LOCAL_APPDATA
Roaming CSIDL_APPDATA
Desktop CSIDL_DESKTOP CSIDL_COMMON_DESKTOPDIRECTORY
Documents CSIDL_PERSONAL CSIDL_COMMON_DOCUMENTS
Music CSIDL_MYMUSIC CSIDL_COMMON_MUSIC
Pictures CSIDL_MYPICTURES CSIDL_COMMON_PICTURES
Videos CSIDL_MYVIDEO CSIDL_COMMON_VIDEO
"다운로드"에 대한 하나가없는 것을 제외하고, 여기에
User System
ProgramData FOLDERID_ProgramData
Local FOLDERID_LocalAppData
Roaming FOLDERID_RoamingAppData
Desktop FOLDERID_Desktop FOLDERID_PublicDesktop
Documents FOLDERID_Documents FOLDERID_PublicDocuments
Downloads FOLDERID_Downloads FOLDERID_PublicDownloads
Music FOLDERID_Music FOLDERID_PublicMusic
Pictures FOLDERID_Pictures FOLDERID_PublicPictures
Videos FOLDERID_Videos FOLDERID_PublicVideos
CSIDL
상수에 해당됩니다 여기
데이터, 문서 및 미디어 파일에 대한 몇 가지
Known Folder GUID가 있습니다
SHGetKnownFolderPath
은 PyWin32로 래핑되지 않습니다. 나는
another answer을 ctypes를 통해 호출합니다. 또는 PyWin32를 사용하여
KnownFolderManager
인스턴스를 만들 수 있습니다.
import pythoncom
from win32com.shell import shell
kf_mgr = pythoncom.CoCreateInstance(shell.CLSID_KnownFolderManager, None,
pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IKnownFolderManager)
downloads_path = kf_mgr.GetFolder(shell.FOLDERID_Downloads).GetPath()
아니면 CSIDL
상수 기존 SHGetFolderPath
함수를 호출 예를 들면 다음과 같습니다. 예를 들면 다음과 같습니다.
from win32com.shell import shell, shellcon
SHGFP_TYPE_CURRENT = 0
SHGFP_TYPE_DEFAULT = 1
local_data_path = shell.SHGetFolderPath(None, shellcon.CSIDL_LOCAL_APPDATA,
None, SHGFP_TYPE_CURRENT)
나는이 대답 에릭 스선을 정말 고맙게 생각합니다. 이 대답은 많은 Windows 10 Python 3 개발자들에게 큰 도움이 될 것입니다. Stackoverflow는 특히 Windows 10과 같은 공통 플랫폼에서 기본을 학습하는 개발자에게 훌륭한 솔루션 소스입니다. –