[PyQt5, pyinstaller] Failed to execute script pyi_rth_qt5plugins

PyQt로 만들어진 프로그램을 윈도우에서 pyinstaller로 컴파일을 했으나
만들어진 프로그램은 실행되지 않고 바로 종료 되었다.

콘솔모드로 컴파일후 콘솔로 실행했더니 아래와 같은 trace back을 얻을수 있었다.

Traceback (most recent call last):
  File "site-packages\pyinstaller-3.2.1+5b84a8d-py3.5.egg\PyInstaller\loader\rthooks\pyi_rth_qt5plugins.py", line 46, in <module>
  File "C:\Python35\lib\site-packages\pyinstaller-3.2.1+5b84a8d-py3.5.egg\PyInstaller\loader\pyimod03_importers.py", line 573, in load_module
    module = loader.load_module(fullname)
ImportError: DLL load failed: 지정된 모듈을 찾을 수 없습니다.
Failed to execute script pyi_rth_qt5plugins


구글링으로 두가지 해결방법을 찾을수 있었다.




pyinstaller develop 버전 설치

  1. github에서 develop branch를 내려받는다.

    https://github.com/pyinstaller/pyinstaller/archive/develop.zip

  2. 기존의 pyinstaller를 제거하고 내려받은 pyinstaller를 설치한다.

    py -3 -m pip uninstall pyinstaller
    cd pyinstaller-develop
    py -3 setup.py install
    

그런데 어째선지 나의 경우에는 설치가 되지 않았다. 아마 개발자가 업데이트 도중 아직 release를 하지 못한 모양이다..
어쩔 수 없이 다른 방법을 찾을수 밖에 없었다.




.spec파일 직접 작성

.spec 파일의 pathex 항목에 PyQt5의 bin디렉토리 경로를 추가해준다.

나의 경우에는 python3이 C:\Python35에 설치돼 있으므로,
PyQt5의 bin 디렉토리 위치는 C:\Python35\Lib\site-packages\PyQt5\Qt\bin 이 된다.

  1. setup.spec 파일을 만들어 각자 상황에 맞게 작성한다.

    # -*- mode: python -*-
    
    block_cipher = None
    app_path = 'my_app.pyw'
    app_name = 'my_app'
    
    a = Analysis([app_path],
                 pathex=[r'C:\Python35\Lib\site-packages\PyQt5\Qt\bin'],
                 binaries=[],
                 datas=[],
                 hiddenimports=[],
                 hookspath=[],
                 runtime_hooks=[],
                 excludes=[],
                 win_no_prefer_redirects=False,
                 win_private_assemblies=False,
                 cipher=block_cipher)
    pyz = PYZ(a.pure, a.zipped_data,
                 cipher=block_cipher)
    exe = EXE(pyz,
              a.scripts,
              exclude_binaries=True,
              name=app_name,
              debug=False,
              strip=False,
              upx=True,
              console=False , icon='' )
    coll = COLLECT(exe,
                   a.binaries,
                   a.zipfiles,
                   a.datas,
                   strip=False,
                   upx=True,
                   name=app_name)
    
  2. spec파일로 컴파일한다

     pyinstaller setup.spec
    

    성공!





참조: https://github.com/pyinstaller/pyinstaller/issues/2152

https://github.com/2minchul/PyQt5-Examples/blob/master/%5BPyQt5%5D%20get%20filepath%20by%20Drag%26Drop/app.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/python3
#-*- coding: utf-8 -*-
 
import sys
from PyQt5 import QtWidgets, QtGui, QtCore
 
class MainWidget(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWidget, self).__init__(parent)
        self.setWindowTitle("title")
        self.resize(720,480)
        self.setAcceptDrops(True)
 
    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls():
            event.accept()
        else:
            event.ignore()
 
    def dropEvent(self, event):
        files = [u.toLocalFile() for u in event.mimeData().urls()]
        for f in files:
            print(f)
 
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = MainWidget()
    MainWindow.show()
    sys.exit(app.exec_())
cs


+ Recent posts