Translate

2017년 6월 15일 목요일

Python 프로그램 exe 파일로 만들기 (+ openpyxl, requests 라이브러리 포함)


Laptop
운영체제Windows 10 Home 64bit
개발프로그램PyCharm Community Edition 2017.1.3
Python 3.4.4

개인적인 용도로 엑셀파일을 생성하는 프로그램을 만들었는데, 파이썬 개발환경이 없는 컴퓨터에서 실행시킬 필요가 있었다.

그러기위해선 exe파일로 만들 필요가 있다.

알아본 결과 대표적으로 3가지 라이브러리가 있는데 각각 테스트 결과는 이렇다.

1. cx_freeze
공식에서 배포를 잘못한건지 내가 못하는건지 모르겠지만 실행파일이 없음. 테스트 실패.

2. py2exe
exe 생성은 잘 되나 openpyxl을 포함하지 못함.

3. pyinstaller
성공.


그래서 pyinstaller를 사용한 예제를 써보겠다.
설치는 pip을 이용하면 된다. (pip install pyinstaller)

단 파이썬 버전 2.7과 3.3~3.5 에서 잘 동작한다고 한다. 최신 버전이 3.6 정도 된 걸로 알고있는데 참고하자. 

적당히 openpyxl 공식사이트에 있는 샘플 소스를 exe로 만들어 보겠다.

excel_test.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
print 'hello world!'from openpyxl import Workbook
wb = Workbook()

# grab the active worksheet
ws = wb.active

# Data can be assigned directly to cells
ws['A1'] = 42

# Rows can also be appended
ws.append([1, 2, 3])

# Python types will automatically be converted
import datetime
ws['A2'] = datetime.datetime.now()

# Save the file
wb.save("sample.xlsx")

print("Complete!")

# 라인 정지
a = input()

추가한 Line 20~ 부분은, 완료 확인과 exe 실행 시 프로그램이 종료하면 같이 꺼지는 커맨드창을 고려하여 의미없는 입력 메소드를 하나 추가했다. (이로써 Enter를 쳤을 때 종료하게 된다.)

이제 커맨드 상에서 소스파일이 있는 위치로 이동한다.
cmd에서 cd로 이동할 수도 있지만 탐색기에서 이동 후 Shift + 마우스 오른쪽버튼 - 여기서 명령 창 열기 를 선택하면 더 쉽다.

그리고 아래 명령어를 입력한다.

> pyinstaller -F -n excel.exe excel_test.py

-F: 한 개의 파일로 만들기. 용량은 당연히 조금더 커진다. (없을 시 dll 파일들과 분리되어 폴더로 생성됨)
-n: 이름짓기. 이름은 바로 오른쪽에 기입 (없을 시 소스파일명과 동일한 파일이 생성됨)
--noconsole: 콘솔창 띄우지 않기



이렇게 ~ successfully 라 뜨면 성공이다.

탐색기를 확인해보면 4가지 파일이 새로 생성되어 있다.



여기서 실제 사용될 exe 파일은 dist 폴더에 저장되어 있다.

실행시켜 보면, 정상적으로 엑셀 파일이 생성되는 것을 볼 수 있다.
(파이썬이 설치되지 않은 컴퓨터에서의 테스트도 완료했다.)



+ requests 라이브러리가 import 되어 있을 때, 위와 같은 과정을 거쳐 만든 exe파일을 실행해보면 이런 오류가 발생한다.



마지막을 읽어보면 queue 라는 모듈이 없다고 한다.
해결법은 간단하다. 생성할 때 queue 모듈을 포함해주면 된다.

>pyinstaller -F excel_test.py --hidden-import=queue

참고 사이트: https://stackoverflow.com/questions/36400111/pyinstaller-doesnt-import-queue

댓글 2개:

  1. [Google+ 질문댓글 백업]

    이정민
    5개월 전 - 공개적으로 공유함
    임포트할 파일이 여러개면 어떻게 하면 되나요?

    답글
    홍다슬
    5개월 전
    저도 그런 추가적인 경우의 테스트를 해보진 않아서,
    일단 Pyinstaller 공식 문서의 Adding Files to the Bundle (25페이지) 부분을 참고해 보시면 될 것 같습니다.
    https://media.readthedocs.org/pdf/pyinstaller/cross-compiling/pyinstaller.pdf



    9999 ANOW
    3개월 전 - 공개적으로 공유함
    생성할 때 queue 모듈을 포함하는 명령어 입력 순서가.. pyinstaller로 exe파일 생성한 이후 인가요?

    답글삭제
  2. pyinstaller -F excel_test.py --hidden-import=queue
    덕분에 32-64비트에서 동시에 동작하는 exe에 라이브러리까지 포함이 잘 됬네요! 감사합니다

    답글삭제