Как добавить файлы stati c (html, css, js) в pyinstaller для создания автономного exe-файла? - PullRequest
3 голосов
/ 29 января 2020

Я использую QtWebEngineWidgets, QtWebChannel для создания приложения PyQt5, которое использует HTML, CSS, JavaScript.

Работает нормально, когда мы работаем в общем режиме, т.е. python main.py

Импорт HTML, как показано ниже,

current_dir = os.path.dirname(os.path.realpath(__file__))
filename = os.path.join(current_dir, "index.html")
url = QtCore.QUrl.fromLocalFile(filename)

Импорт CSS, JavaScript файлов, как показано ниже,

# in index.html
<link rel="stylesheet" href="styles.css">
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="my_custom.js"></script>

Теперь я пытаюсь создать автономный файл .exe, используя 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)

Команда Pyinstaller:

pyinstaller --onefile --windowed main.py

Мне нужно вручную добавить файлы stati c в сгенерированный файл .exe, чтобы работать как положено. Который я хочу включить в .exe сам файл. Как это получить?

1 Ответ

4 голосов
/ 29 января 2020

Из вашего вопроса вы можете предположить, что структура вашего проекта выглядит следующим образом:

├── index.html
├── jquery.js
├── main.py
├── my_custom.js
└── styles.css

Для вашего случая есть 2 варианта:

  1. с использованием --add-data

    import os
    import sys
    
    from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets
    
    
    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)
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        view = QtWebEngineWidgets.QWebEngineView()
    
        filename = resource_path("index.html")
        url = QtCore.QUrl.fromLocalFile(filename)
    
        view.load(url)
        view.show()
        sys.exit(app.exec_())
    

    Если вы хотите добавить внешние ресурсы в исполняемый файл, вы должны использовать опцию «--add-data»:

    pyinstaller --onefile --windowed --add-data="index.html:." --add-data="jquery.js:." --add-data="my_custom.js:." --add-data="styles.css:." main.py
    

    Для windows измените ":" на ";".

  2. , используя .qrc

    С помощью этого метода вы конвертируете файлы ( . html,. css,. js, et c) в коде .py с использованием pyrcc5, для этого необходимо выполнить следующие шаги:

    2.1. Создайте файл с именем resource.qr c со следующим содержимым в папке проекта:

    <RCC>
        <qresource prefix="/">
            <file>index.html</file>
            <file>jquery.js</file>
            <file>my_custom.js</file>
            <file>styles.css</file>
        </qresource>
    </RCC>
    

    2.2. Преобразуйте его в .py, используя pyrcc5:

    pyrcc5 resource.qrc -o resource_rc.py
    

    2.3 Импортируйте resource_r c .py файл и используйте URL со схемой "qr c" в файле main.py:

    import os
    import sys
    
    from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets
    
    import resource_rc
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        view = QtWebEngineWidgets.QWebEngineView()
    
        url = QtCore.QUrl("qrc:/index.html")
    
        view.load(url)
        view.show()
        sys.exit(app.exec_())
    

    2.4 Скомпилируйте проект, используя исходную команду

    pyinstaller --onefile --windowed main.py
    
...