当前位置: 首页 > 面试题库 >

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

郗亦
2023-03-14
问题内容

我正在使用 QtWebEngineWidgetsQtWebChannel创建使用HTML,CSS,JavaScript的PyQt5应用程序。

当我们以一般方式运行时,它工作正常,即 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

我需要在生成的.exe文件中手动添加静态文件才能按预期工作。我想将其包含在.exe文件本身中。如何得到这个?


问题答案:

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

├── 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,将“:”更改为“;”。

  1. 使用 .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文件中使用带有模式“ 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


 类似资料:
  • 背景资料 我有一个spring boot应用程序,它有文件添加到资源文件的文件夹中,该文件最终内置到执行中使用的jar文件中。 这个jar应用程序需要在不同客户机的多个实例中运行。所以我所做的就是创建一个外部文件,用于区分每个用户的设置。http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-exter

  • 我想使用java创建log.html文件,当错误被捕获时,我会将错误转储到html table-row中。我创建了表列,但是当我向它传递任何内容时,我的数据会覆盖列名而不是附加行。我的java代码如下: 以下是writetofile方法:

  • 问题内容: 我是新手,并且已经学习了很多天,我已经开始使用django建立一个小型网站,并尝试通过在文件中安排所有必要的设置来提供文件。但不幸的是,我的代码无法提供CSS文件,我的意思是提供CSS文件的概念无法正常工作。我在Google上搜索了很多东西,并浏览了django主要文档教程,并根据它们进行了更改,但仍然无法正常工作,因此将我的整个代码粘贴到了下面 项目文件夹的结构 我的一些settin

  • 动态的 web 应用也需要静态文件,一般是 CSS 和 JavaScript 文件。理想情况下你的 服务器已经配置好了为你的提供静态文件的服务。在开发过程中, Blade 也能做好这个工作。我们在 resources 目录下创建一个名为 static 的文件夹存储静态资源文件,静态文件位于 应用的 /static 中。 Blade 默认设置了 static、assets、webjars、uploa

  • 我在学烧瓶。我知道要在处为静态文件生成url,我需要执行以下操作:。我还知道我可以使用模板生成HTML,使用,它将在处返回jinja模板的HTML输出。 但是,我不确定如何在jinja模板中返回到静态文件的链接--或者我是否应该这样返回链接到静态HTML/CSS的HTML。 基本上,我如何在jinja模板中返回到用python动态生成的URL的链接?这似乎不可能。那么人们做什么呢?如果您只是在模板