00. 글내용 선요약
- 오프라인 환경에서는 패키지를 다운로드 받을 수 없음
- 온라인에서 미리 패키지(의존성 포함) 다운로드 받아 오프라인에서 설치할 수 있음
- 패키지는 "whl"과 "setup.py" 2가지 유형이 있음
- 패키지명에 해당하는 폴더를 생성하고, 그 곳에 모든 패키지를 다운로드 함
- 특히 압축파일 패키지는 압축을 풀어 폴더를 생성함
- 배치파일을 생성하여 그 내용에 패키지 설치명령어를 넣어둠
- 오프라인에서 배치파일 실행으로 편리하게 일괄 설치가능함
* 반드시 1, 온라인 오프라인 환경이 같은 버전의 파이썬을 사용해야 함
* 반드시 2, install 배치파일은 관리자 권한으로 실행되어야 함
01. 의존성
패키지를 구동하기 위해 다른 패키지가 필요한 경우가 있다. 이를 패키지 의존성이라고 함
나무를 예를 들자면,
꽃을 보기위해서는 줄기가 있어야하고
줄기는 가지가... 가지는 기둥이... 기둥은 뿌리가 있어야 한다.
파이썬에서 꽃을 이용하려면,
꽃, 줄기, 가지, 기둥, 뿌리를 모두 다운로드 받아 설치되어야 한다.
02. 다운로드 명령어 PIP
pip download "설치할패키지"
명령어를 실행한 폴더에 "설치할패키지" + "관련패키지"가 일괄 다운로드 됨
다운로드의 순서는 "설치할패키지" → "상위 패키지" → "상위의 상위 패키지" .... (반복)
03. 자동화 과정
- 어느 패키지를 다운로드 받을지, 패키지명을 입력받는다. (input)
- 패키지 이름을 갖는 폴더를 생성하고, 생성된 폴더에서 작업이 실행된다.
- 다운로드 배치파일을 만든다. (pip download 패키지)
- 다운로드 받는 과정의 결과를 (패키지명_seq.txt) 파일에 저장한다.
- txt 파일을 파싱한다. (패키지 의존성은 상위 → 하위 순 : 다운로드의 역순)
- 압축유형(zip, tar.gz)파일은 압축을 풀어준다.
- 설치명령어 배치파일을 만든다. (pip install 패키지 / python setup.py install)
04. 파이썬 코드
해당코드의 파이썬파일 다운로드 ↓
import os
import tarfile
import zipfile
# 현재위치 미리저장
dir_orig = os.getcwd()
# 패키지명 폴더 생성
pkgName = input("다운로드 패키지명 입력 : ")
try:
os.makedirs(f"./{pkgName}")
except OSError:
pass
# 작업위치로 이동
os.chdir(f"./{pkgName}")
# 패키지다운로드 배치파일 생성
with open(f"{pkgName}_down.bat", 'w') as f:
f.write(f"pip download {pkgName} > {pkgName}_seq.txt")
# 패키지다운로드 실행
os.system(f"{pkgName}_down.bat")
# 패키지순서 파일열기
with open(f"{pkgName}_seq.txt", 'r', newline="") as f:
lines = f.readlines()
# 패키지순서대로 설치명령어 작성
pkgList = []
for line in lines:
if ("Using cached" in line) or ("Downloading" in line):
contents = line.split(" ")
chk = 0
for content in contents:
if "whl" in content:
cmd = f"pip install {content}\n"
pkgList.append(cmd)
chk = 1
elif ".zip" in content:
with zipfile.ZipFile(content) as z:
print("zip파일존재, 확인필요")
#folder = z.namelist()[0]
folder = content.replace(".zip", "")
z.extractall("")
cmd = f"python {folder}/setup.py install\n"
pkgList.append(cmd)
chk = 1
elif ".tar" in content:
with tarfile.open(content) as tar:
folder = tar.getnames()[0]
tar.extractall("")
cmd = f"python {folder}/setup.py install\n"
pkgList.append(cmd)
chk = 1
if chk == 0: # 확장자가 그밖의 형식일때...
print(f"내용확인 : {line}")
# 역순으로 배치
pkgList = pkgList[::-1]
# 패키지 수동설치 배치파일 생성
with open(f"{pkgName}_install.bat", "w") as f:
for pkg in pkgList:
f.write(pkg)
# 원래위치로 복원
os.chdir(dir_orig)
05. 코드실행
07. 인스톨배치파일 실행
관리자 권한으로 실행된 CMD or 파일탐색기에서 패키지명_install.bat를 실행하면
의존성을 만족시키는 순서로 목표한 패키지 설치가 완료된다.
반드시, 관리자권한으로 실행 + 설치파일을 생성한 파이썬과 같은 버전의 파이썬에서 적용해야 오류가 없다.