HTMLImgRelocater 개발과정과 파이썬 실행 파일 배포하는 방법에 대한 글입니다.
제작 동기
구글 독스로 작업을 하던 중 인디자인에서의 이미지 링크 작업을 위해 원본 이미지 파일들을 정렬할 필요가 있었다.
그래서 html파일에 언급된 순서대로 사진에 번호를 붙여 넘버링을 하는 간단한 파이썬 코드를 작성하여 활용하였다.
import os
import re
import shutil
import urllib.parse
#다운로드한 html파일의 이름 ex) index.html
HTML_FILE_NAME="index.html"
#다운로드한 이미지 폴더의 이름 ex) images
IMAGES_FOLDER_NAME="images"
RELOCATED_FOLDER_NAME="Relocated_images"
# HTML 파일을 읽습니다.
with open(f'./{HTML_FILE_NAME}', 'r') as f:
html = f.read()
matches = []
for match in re.findall(r'src="(.+?)"', html):
if match.endswith('.png'):
file_name = os.path.basename(match)
decoded_name = urllib.parse.unquote(file_name)
matches.append(decoded_name)
print(matches)
# 새로운 폴더를 만들어 이미지를 저장합니다.
if not os.path.exists(RELOCATED_FOLDER_NAME):
os.makedirs(RELOCATED_FOLDER_NAME)
else:
shutil.rmtree(RELOCATED_FOLDER_NAME)
os.makedirs(RELOCATED_FOLDER_NAME)
used_names = set()
for i, match in enumerate(matches):
old_name = match
new_name = f'{i+1}.png'
# 중복된 이미지가 발견될 경우, 넘버링을 바꾸어 파일 이름을 만듭니다.
while new_name in used_names:
i += 1
new_name = f'{i+1}.png'
used_names.add(new_name)
print(f"{old_name} -> {new_name}")
shutil.copy(os.path.join(IMAGES_FOLDER_NAME, old_name), os.path.join(RELOCATED_FOLDER_NAME, new_name))
이를 활용하여 각 챕터의 이미지를 정렬하는데 쓸 시간을 아낄 수 있었다.
그래서 더 나아가, 접근성도 높일 겸 배포까지 해보려고 한다.
파이썬 배포 방법 장단점 비교
파이썬 프로그램의 배포 방법 세 가지의 장단점을 비교한 것이다.
- 코랩(Google Colab):
장점:
- 설치가 필요 없으며 웹 브라우저에서 실행가능
- Google의 컴퓨팅 자원을 무료로 사용 가능
단점:
- 인터넷 연결이 필요함
- 사용자가 코드를 실행하는 동안 연결이 끊기거나 문제가 발생할 수 있다.
- 이미지 폴더 업로드가 힘들다.
- 실행파일(Standalone Executable):
장점:
- 인터넷 연결이 없어도 실행가능
- 사용자가 별도의 프로그램 설치 없이 실행 가능
- 실행하기 위한 환경 설정이 적게 필요
단점:
- 코드를 수정하거나 업데이트하기가 어려움.
- 사용자가 실행 파일을 다운로드하고 설치해야 함.
- 웹(Web):
장점:
- 사용자가 웹 브라우저를 통해 쉽게 접근 가능
- 별도의 프로그램 설치 없이 사용 가능
- 코드를 업데이트하거나 수정하기가 쉬움
단점:
- 인터넷 연결이 필요.
- 서버 구축 및 관리에 시간과 비용이 들 수 있음.
- 그냥 가볍게 만드는 건데 대용량 이미지 파일 업로드/다운로드 감당 안됨
결론 : 코랩과 웹 둘다 대용량 이미지 파일 업로드에 걸리는 시간이 오래걸리고, 간단한 프로젝트인데 서버까지 구축할 필요는 없어보여, 파일 업로드를 할 필요가 없는 실행파일로 배포를 하기로 했다.
실행파일 소스코드
기존에 작성했던 코드에서 간단히 두 가지 정도만 추가했다.
- 현재 실행 파일이 있는 폴더의 파일목록을 출력하고, html과 이미지 폴더의 이름을 입력받는 기능을 추가
- 진행상황 볼 수 있게 로그 출력
HTMLImgRelocater.py
import os
import re
import shutil
import urllib.parse
import sys
# 실행 파일의 절대 경로를 찾습니다.
exe_path = os.path.abspath(sys.argv[0])
# 실행 파일이 있는 폴더로 이동합니다.
exe_folder = os.path.dirname(exe_path)
os.chdir(exe_folder)
# 현재 폴더의 파일 목록을 출력합니다.
print("현재 폴더의 파일 목록:")
for item in os.listdir():
print(f" - {item}")
#다운로드한 html파일의 이름 ex) index.html
HTML_FILE_NAME = input("다운로드한 html파일의 이름을 입력해주세요 (예: index.html): ")
# HTML 파일이 존재하는지 확인합니다.
if not os.path.exists(HTML_FILE_NAME):
print(f"파일 {HTML_FILE_NAME} 이(가) 존재하지 않습니다. 파일 이름을 확인하고 다시 시도하세요.")
exit()
#다운로드한 이미지 폴더의 이름 ex) images
IMAGES_FOLDER_NAME = input("다운로드한 이미지 폴더의 이름을 입력해주세요 (예: images): ")
# 이미지 폴더가 존재하는지 확인합니다.
if not os.path.exists(IMAGES_FOLDER_NAME):
print(f"폴더 {IMAGES_FOLDER_NAME} 이(가) 존재하지 않습니다. 폴더 이름을 확인하고 다시 시도하세요.")
exit()
RELOCATED_FOLDER_NAME = "Relocated_images"
# HTML 파일을 읽습니다.
with open(f'./{HTML_FILE_NAME}', 'r') as f:
html = f.read()
matches = []
for match in re.findall(r'src="(.+?)"', html):
if match.endswith('.png'):
file_name = os.path.basename(match)
decoded_name = urllib.parse.unquote(file_name)
matches.append(decoded_name)
print("찾은 이미지:")
print(matches)
# 새로운 폴더를 만들어 이미지를 저장합니다.
if not os.path.exists(RELOCATED_FOLDER_NAME):
os.makedirs(RELOCATED_FOLDER_NAME)
print(f"'{RELOCATED_FOLDER_NAME}' 폴더를 생성했습니다.")
else:
shutil.rmtree(RELOCATED_FOLDER_NAME)
os.makedirs(RELOCATED_FOLDER_NAME)
print(f"'{RELOCATED_FOLDER_NAME}' 폴더를 재생성했습니다.")
print("\\n이미지 이동:")
used_names = set()
for i, match in enumerate(matches):
old_name = match
new_name = f'{i+1}.png'
# 중복된 이미지가 발견될 경우, 넘버링을 바꾸어 파일 이름을 만듭니다.
while new_name in used_names:
i += 1
new_name = f'{i+1}.png'
used_names.add(new_name)
print(f"{old_name} -> {new_name}")
shutil.copy(os.path.join(IMAGES_FOLDER_NAME, old_name), os.path.join(RELOCATED_FOLDER_NAME, new_name))
print(f"\\n모든 이미지가 {RELOCATED_FOLDER_NAME}로 복사되어 이동되었습니다!")
파이썬 실행파일 생성 방법
1. 터미널에서 다음 명령어를 실행시켜 실행파일을 위한 라이브러리인 PyInstaller를 설치했다.
pip install pyinstaller
2. 터미널에서 HTMLImgRelocater.py가 저장된 디렉토리로 이동한 후 아래 명령어를 실행하여 실행 파일을 생성했다.
pyinstaller --onefile HTMLImgRelocater.py
이 명령어는 실행 파일을 생성하고 "dist"라는 폴더에 저장한다. 생성된 실행 파일은 HTMLImgRelocater (macOS 및 Linux의 경우) 또는 HTMLImgRelocater.exe (Windows의 경우)이다. 이 실행 파일을 다른 컴퓨터에서도 사용할 수 있으며, 파이썬 인터프리터 설치 없이 실행할 수 있다.
HTMLImgRelocater의 사용방법은 아래 글에 정리했다.