2017-09-24 2 views
1

일반적인 "쓰기 가능한 데이터 파일 및 C 드라이브 경로"를 설정하는 Python 3 os 명령은 무엇입니까? Windows 10 응용 프로그램. 이 질문에는 다음과 같은 몇 가지 부분이 있습니다.일반적인 Windows 10 응용 프로그램의 "쓰기 가능한 데이터 파일 및 C 드라이브 경로"를 설정하는 Python 3 os 명령은 무엇입니까?

  1. My Python 3 프로그램은 데이터 파일의 용도 중 일부로 (여러) 데이터 파일을 만듭니다. 내 MSI 설치 프로그램이/Programs에 설치하면 Python 실행 파일에 데이터 파일을 만들고 쓰는 권한이 없습니다. 따라서, 제 질문의 첫 번째 부분은 : os 기능을 사용하여 특정 디렉토리에 데이터 파일을 작성하기 위해 Python 3 프로그램을 변경해야합니까? 예를 들어 줄 수 있습니까?

  2. 제 질문의 두 번째 부분은 간단합니다 : 일반적인 Windows 10 PC의 Windows 10 디렉토리 (예 : 홈 경로, AppData 경로 등)를 탐색 할 때 os 명령 옵션이 도움이 될 수 있습니다.

  3. MSI 설치 프로그램에 cx_Freezing한다는 점에 유의하십시오. MSI 설치 프로그램이 클라우드 (google 드라이브 또는 GitHub)의 일반적인 원격 설치를 위해 자동화해야하므로 위의 1 및 2에 응답 할 때 명심하십시오. .

주의 : 새 창 10 연락처 관리 응용 프로그램 : 다음은이 프로그램에 대한 MSI 설치 프로그램입니다. 프로그래밍 지식과 경험에 미리

https://drive.google.com/drive/folders/0Bz98wvqqw-1QRUNFcUJLU21yT1k

감사합니다.

기술 지원 및 설명에 감사드립니다.

답변

1

사용자의 프로필 폴더 (예 : 환경 변수) 또는 홈 폴더 (예 : "%HomeDrive%%HomePath%")에 직접 파일 및 디렉토리를 저장하지 않는 것이 좋습니다. 이것은 유닉스에서 홈 디렉토리 (XDG 기본 디렉토리 스펙을 무시하는 경우)의 일반적인 관행과 다르지만 레드먼드에서는 마이크로 소프트와 마찬가지입니다.

로컬 데이터 폴더 (사용자 별), 로밍 데이터 폴더 (사용자 별) 또는 프로그램 데이터 폴더 (사용자 별) 중 하나 이상에서 응용 프로그램에 대해 고유 한 폴더를 만듭니다. 기계). 이러한 폴더는 일반적으로 사용자가 직접 액세스하지 않으므로 기본적으로 숨겨져 있습니다.

캐시에는 로컬 데이터 폴더를 사용하십시오. 상태 저장 사용자 데이터 및 구성에는 로밍 데이터 폴더를 사용하십시오. 사용자와 관련이없는 데이터 및 캐시에는 프로그램 데이터 폴더를 사용하십시오. 예를 들어, pip와 같은 프로그램은 다운로드 한 패키지를 캐시하기 위해 프로그램 데이터 폴더를 사용할 수 있습니다. 실제적으로 pip는 사용자 당 패키지를 캐시하지만 원칙적으로 컴퓨터 당 캐시 할 수 있습니다.

응용 프로그램에서 프로그램 데이터 폴더를 사용하는 경우 폴더에서 모든 사용자에게 하위 폴더 및 파일을 추가하고 수정할 수있는 권한을 부여해야합니다. lazily 폴더를 만들면 수동으로 사용 권한을 추가 할 수 있습니다. 파일 보안을 수정하는 방법에 대한 예제는 this answer을 참조하십시오.

로컬, 로밍 및 프로그램 데이터 폴더의 환경 변수는 각각 LocalAppData, AppDataProgramData입니다. 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) 
+0

나는이 대답 에릭 스선을 정말 고맙게 생각합니다. 이 대답은 많은 Windows 10 Python 3 개발자들에게 큰 도움이 될 것입니다. Stackoverflow는 특히 Windows 10과 같은 공통 플랫폼에서 기본을 학습하는 개발자에게 훌륭한 솔루션 소스입니다. –

관련 문제