이 포스팅은 윈도우 OS 기반으로 작성되었습니다.
파이썬으로 애플리케이션을 만들어 배포했을 때,
이 앱이 C드라이브의 일반적인 설치경로(C://Program Files)에 설치되면
파일을 생성, 수정 및 삭제가 제한이 걸리는 문제가 생길 수 있다.
C://Program Files (x86) 경로에 다음과 같은 파일이 있다고 해보자.
참고로 외부에서 작성한 후 복사&붙여넣기 했다.
외부에서 만들어서 복사하는데도 관리자 권한을 요구한다.
from pathlib import Path
dir = Path('./test')
dir.mkdir(exist_ok=True)
윈도우 보안정책으로 인해 폴더 생성을 거부당했다.
따라서 우회로에 데이터를 저장할 방법을 찾아야 한다.
Path.home(), platform.system() 함수
Path.home() 함수는 사용자의 기본 경로를 안내한다.
from pathlib import Path
print(Path.home())
>>>
C:\Users\Tripleler
내 컴퓨터 이름을 Tripleler 이라고 해두어서 tripleler가 출력된다.
대부분의 앱은 이 경로안의 AppData\Roaming 폴더에 데이터를 저장한다.
이 AppData폴더는 숨겨진 폴더이기 때문에 보기 탭에서 숨긴 항목을 체크해야 보여진다.
오래된 컴퓨터나 노트북에는 미처 지우지 못한 더미데이터들이 잔뜩 공간을 차지할 수도 있다.
이제 더미데이터를 늘려(?)보자.
import os
from pathlib import Path
import platform
def is_writeable(dir):
return os.access(dir, os.F_OK & os.R_OK & os.W_OK & os.EX_OK)
def user_config_dir(dir='test\\python'):
cfg = {'Windows': 'AppData/Roaming', 'Linux': '.config', 'Darwin': 'Library/Application Support'} # 3 OS dirs
path = Path.home() / cfg.get(platform.system(), '')
path = (path if is_writeable(path) else Path('/tmp')) / dir
path.mkdir(exist_ok=True, parents=True) # make if required
return path
CONFIG_DIR = user_config_dir()
print(CONFIG_DIR)
>>>
C:\Users\Tripleler\AppData\Roaming\test\python
권한이 없어도 생성이 된 것을 볼 수 있다.
platform.system()함수는 OS환경에 따라 Windows, Linux, Darwin등의 환경을 반환한다.
os.access() 함수는 해당 경로에 접근여부를 나타낸다.
이 때, 4개지 인자를 사용할 수 있다.
1. os.F_OK : 해당 경로의 존재여부
2. os.R_OK : 해당 경로의 읽기 가능여부
3. os.W_OK : 해당 경로의 쓰기 가능여부
4. os.X_OK : 해당 경로의 실행 가능여부
&나 | 로 조건을 결합할 수 있다.
조건이 가능하면 True, 불가능하면 False를 반환한다.
위 파일에서 4가지중 하나라도 불가능하면 /tmp폴더에 경로를 생성하라고 코딩했다.
False로 주면
def is_writeable(dir):
return False
이 경로는 다음과 같다.
C:\tmp\test\python
이제 위 코드를 이용해서 접근권한을 얻지 않아도 데이터를 생성, 수정 및 삭제할 수 있다.
'기술' 카테고리의 다른 글
nsis 2GB limit 우회하기 (0) | 2022.04.07 |
---|---|
NSIS 언어팩 오류 해결법 (0) | 2022.03.30 |
nsis를 통한 배포 패키징 하기 (0) | 2022.03.28 |
파이썬 설치 파일 만들기 with pyinstaller (0) | 2022.03.23 |
댓글