2016-06-17 6 views
7

Qit Designer를 사용하여 만든 .ui 파일에 의존성이있는 PyInstaller를 사용하여 .py 스크립트를 .exe로 내보내려고합니다.PyInstaller + UI 파일 - FileNotFoundError : [Errno 2] 해당 파일이나 디렉토리가 없습니다.

PyCharm을 통해 내 .py 스크립트를 실행할 때 제대로 작동하는지 확인할 수 있습니다. - .ui 파일로 만든 GUI를 볼 수 있습니다. 내가 .exe를하고 시작하는 내 평 스크립트를 내보낼 때

그러나, 나는 명령 줄에 다음과 같은 오류를받을 : 몇 가지 이유를 들어

C:\Users\giranm>"C:\Users\giranm\PycharmProjects\PyQt Tutorial\dist\secSearch_demo.exe" 
Traceback (most recent call last): 
    File "secSearch_demo.py", line 13, in <module> 
    File "site-packages\PyQt4\uic\__init__.py", line 208, in loadUiType 
    File "site-packages\PyQt4\uic\Compiler\compiler.py", line 140, in compileUi 
    File "site-packages\PyQt4\uic\uiparser.py", line 974, in parse 
    File "xml\etree\ElementTree.py", line 1186, in parse 
    File "xml\etree\ElementTree.py", line 587, in parse 
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\giranm\\securitySearchForm.ui' 
Failed to execute script secSearch_demo 

이 .exe 파일을 찾고 있습니다 C : \ Users \ giranm \

그러나 이미 연구를 해본 결과, os.getcwd()를 사용해야하고 스크립트에 전체 경로가 있는지 확인해야한다고 들었습니다. . 아래 코드를 사용해도 여전히 .ui 파일을 찾으려고하는 동안 오류가 발생합니다.

PyInstaller: IOError: [Errno 2] No such file or directory:

# import relevant modules etc... 

cwd = os.getcwd() 
securitySearchForm = os.path.join(cwd, "securitySearchForm.ui") 
popboxForm = os.path.join(cwd, "popbox.ui") 

Ui_MainWindow, QtBaseClass = uic.loadUiType(securitySearchForm) 
Ui_PopBox, QtSubClass = uic.loadUiType(popboxForm) 

# remainder of code below. 

나는 한 평하고 pyuic4를 사용하여 메인 루틴로 가져올 수있는 파일을 .ui 변환 할 수 있음을 알고 있어요. 그러나 .ui 파일을 여러 번 편집 할 예정이므로이 파일을 계속 변환 할 수는 없습니다.

어쨌든 이것을 수정하여 독립 실행 형 .exe를 만들 수 있습니까?

나는 PyQT4와 PyInstaller를 사용하는 데 상당히 익숙하다.

답변

7

주말 내내 머리를 긁고 SO를 더보고 나면 UI 파일을 사용하여 예상대로 독립 실행 형 .exe를 컴파일 할 수있었습니다.

첫째, 내가 필요한 클래스에 대해이 기능과 변수를 사용하여 .UI 파일을 가져이 답변

Bundling data files with PyInstaller (--onefile)

# Define function to import external files when using PyInstaller. 
def resource_path(relative_path): 
    """ Get absolute path to resource, works for dev and for PyInstaller """ 
    try: 
     # PyInstaller creates a temp folder and stores path in _MEIPASS 
     base_path = sys._MEIPASS 
    except Exception: 
     base_path = os.path.abspath(".") 

    return os.path.join(base_path, relative_path) 

다음을 사용하여 다음 함수를 정의했다.

# Import .ui forms for the GUI using function resource_path() 
securitySearchForm = resource_path("securitySearchForm.ui") 
popboxForm = resource_path("popbox.ui") 

Ui_MainWindow, QtBaseClass = uic.loadUiType(securitySearchForm) 
Ui_PopBox, QtSubClass = uic.loadUiType(popboxForm) 

나는 다음 Qt는 디자이너와이 리소스 파일을 사용하여 삽입 이미지/아이콘을 사용하여 리소스 파일 (.qrc)을 작성했다. 일단 끝나면 pyrcc4를 사용하여 .qrc 파일을 주 스크립트에서 가져올 .py 파일로 변환했습니다. 내가 메인 평 스크립트를 확인하면 터미널

C:\Users\giranm\PycharmProjects\PyQt Tutorial>pyrcc4 -py3 resources.qrc -o resources_rc.py 

파이썬

import resources_rc 

내가 다음 pyInstaller 중에를 사용을 .spec 파일을 만들어 작동합니다.터미널

C:\Users\giranm\PycharmProjects\PyQt Tutorial>pyi-makespec --noconsole --onefile secSearch_demo.py 

는 pyInstaller 중에 가이드 당, 나는 위의을 .spec 파일을 수정하여 데이터 파일을 추가했습니다.

https://pythonhosted.org/PyInstaller/spec-files.html#adding-data-files

마지막으로, 나는 그 위에서을 .spec 파일을 사용하여 .EXE 컴파일.

관련 문제