문제 상황
만든 파이썬 크롤링 소스코드를 다른 컴퓨터에서 실행할 수 있도록 프로그램화 하기 위해서 exe 파일을 만들기 위해 평소와 같이 pyinstaller을 사용하여 패키징(실행파일 형태로 제작)을 하고 있었다.
pyinstaller -F [python 파일 경로주소]
실행 파일이 만들어지고 나서 내 컴퓨터에서는 잘 실행이 되었지만 다른 컴퓨터에서는 해당 파일이 정상적으로 작동하지 않았다.
문제 원인
필자는 txt 파일을 읽어와서 그 적힌 값을 랜덤하게 가져오는 코드를 짠 적이 있는데, [문제 상황]에 있는 명령어로 하면 python 파일이 패키징이 된 것이지 txt 파일은 포함이 되지 않아 문제가 생겼었다.
다른 컴퓨터 입장에서는 실행 파일을 실행했을 때 이런 생각이 드는 것이다.
"pc_user_agent.txt 파일 그게 어디있는데?"
문제 해결
패키징을 할 때 해당 파일도 실행 파일과 함께 번들링을 해주어야 한다.
(번들링 : 2개 이상의 제품을 하나로 묶는 것 => ex. python 파일과 원하는 txt 파일을 하나로 묶는다.)
1. visual studio code 에서 Terminal을 킨다.
2. Terminal에서 아래와 같은 명령어를 입력한다.
pyinstaller --onefile --add-data "[원본 데이터 파일의 경로];[실행 파일 실행 시 데이터 파일을 참조할 위치]" [exe 파일로 만들 python 파일 경로]
예시)
pyinstaller --onefile --add-data "pc_user_agent.txt;." C:\outsourcing\13_naver_map_crawling_program2\naver_map_crawling.py
--onefile 옵션(또는 -F 옵션) : 단일 실행 파일을 생성해준다. (사용자 입장에서 단일 실행 파일 하나만 실행하면 실행이 되게끔 해준다.)
--add-data 옵션 : 실행 파일과 함께 번들링할 데이터 파일을 지정해준다. (나의 경우 txt 파일이 필요했다. 이미지 파일도 가능하다.)
이때 -add-data "pc_user_agent.txt;." 처럼 지정하면 pc_user_agent.txt 파일을 현재 디렉토리(.)로 번들링하여 실행 파일과 함께 배포한다는 의미이다.
앞의 pc_user_agent.txt의 의미는 나의 Terminal 현재 경로가 C:\outsourcing 이라면 visual studio code에서 C:\outsourcing 에 있는 pc_user_agent.txt 파일을 가져와서 함께 번들링 한다는 것이다. (상대경로 사용)
; 뒤에 있는 구문의 의미는 이 pc_user_agent.txt 파일을 .(exe 파일을 실행한 현재 경로)에 저장한 것처럼 참조할 수 있도록 해준다.
3. dist 파일에서 exe 파일을 확인한다.
예시)
- 단일 실행 파일로 생성 (-F 나 --onefile 옵션 사용)
- 번들링이 필요한 데이터 (python 소스코드와 함께 묶여야 하는 파일) : pc_user_agent.txt 와 mobile_scroll.txt
- 현재 visual studio code에서는 pc_user_agent.txt가 C:\outsourcing\10_naver_map_crawling_program\pc_user_agent.txt 에 저장되어 있고, mobile_scroll.txt가 C:\outsourcing\mobile_scroll.txt 에 저장되어 있다. (--add-data 옵션 사용)
- pc_user_agent.txt 는 프로그램 실행 시 C:\appdata 에 저장된 것처럼 해주고, mobile_scroll.txt는 프로그램 실행 시 프로그램을 실행한 현재 경로에 저장된 것처럼 하고자 한다.
- exe 파일로 만들 python 소스코드의 경로 : C:\outsourcing\13_naver_map_crawling_program2\naver_map_crawling.py
조건을 만족하여 exe 파일을 생성하면?
pyinstaller -F --add-data "C:\outsourcing\10_naver_map_crawling_program\pc_user_agent.txt;C:\appdata" --add-data "C:\outsourcing\mobile_scroll.txt;." C:\outsourcing\13_naver_map_crawling_program2\naver_map_crawling.py