如何在 pyinstaller 中添加静态(html、css、js 等)文件以创建独立的 exe 文件?

Posted

技术标签:

【中文标题】如何在 pyinstaller 中添加静态(html、css、js 等)文件以创建独立的 exe 文件?【英文标题】:How to add static(html, css, js, etc) files in pyinstaller to create standalone exe file? 【发布时间】:2020-01-29 11:29:10 【问题描述】:

我正在使用QtWebEngineWidgetsQtWebChannel 创建 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>

现在,我正在尝试使用 pyinstaller 创建一个独立的 .exe 文件。

我从here 尝试过,但没有成功。

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

我需要在生成的.exe 文件中手动添加静态文件才能按预期工作。我想将它包含在.exe 文件本身中。这个怎么弄?

【问题讨论】:

【参考方案1】:

根据您的问题,您可以推测您的项目结构如下:

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

对于您的情况,有 2 个选项:

    使用--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
    

    对于窗口,将“:”更改为“;”。

    使用.qrc

    使用此方法,您将使用 pyrcc5 将文件(.html、.css、.js 等)转换为 .py 代码,为此您必须遵循以下步骤:

    2.1。在项目文件夹中创建一个名为 resource.qrc 的文件,内容如下:

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

    2.2 使用 pyrcc5 将其转换为 .py:

    pyrcc5 resource.qrc -o resource_rc.py
    

    2.3 导入resource_rc.py文件,并在main.py文件中使用带有schema“qrc”的url:

    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
    

【讨论】:

感谢您的帮助。一个小疑问,使用第二种方法:在HTML中,我需要将文件导入为&lt;script type="text/javascript" src="qrc:///jquery.js"&gt;&lt;/script&gt;吗?还是有其他方法? 使用第一种方法,我得到错误pyinstaller: error: argument --add-data: invalid add_data_or_binary value: 'index.html:.' @Pythoncoder 尝试执行:pyinstaller --onefile --windowed --add-data="index.html;." --add-data="jquery.js;." --add-data="my_custom.js;." --add-data="styles.css;." main.py 是的,它正在使用;。谢谢。是什么原因? @Pythoncoder 见github.com/pyinstaller/pyinstaller/issues/…

以上是关于如何在 pyinstaller 中添加静态(html、css、js 等)文件以创建独立的 exe 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pyinstaller 中添加静态(html、css、js 等)文件以创建独立的 exe 文件?

如何在 Google App Engine 上托管静态 HTML 文件?

使用 onefile 选项在 Pyinstaller 中添加数据文件

在EXE中使用PyInstaller打包数据文件

静态网页是啥

pyinstaller命令封装程序并添加图标