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

我正在使用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 文件本身中。这个怎么弄?

【问题讨论】:

    标签: python pyqt pyqt5 pyinstaller qwebengineview


    【解决方案1】:

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

    ├── 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
      

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

    2. 使用.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
    • 是的,它正在使用;。谢谢。是什么原因?
    猜你喜欢
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    相关资源
    最近更新 更多