Pyinstaller PyQt5 ModuleNotFoundError 第二个窗口不会打开

时间:2021-03-12 06:21:59

标签: python pyqt5 pyinstaller specifications modulenotfounderror

我正在尝试使用 PyQt5 和第二个 .py 文件打开第二个 GUI - 它在 IDE 中工作,但在编译为单个 .exe 时不起作用。第一个 GUI 打开,第二个没有。我收到 ModuleNotFoundError。

Traceback (most recent call last):
  File "C:\Users\Me\PycharmProjects\ProjectName\dist\firstwindow\secondwindow.py", line 1, in <module>
    import mysql.connector
ModuleNotFoundError: No module named 'mysql'

我已经尝试以多种方式修改规范文件,现在我什至想不起来了。据我所知,Pyinstaller 从第一个 .py 文件导入模块没有问题,但是当它尝试在 secondwindow.py 上进行二级导入或隐藏导入时 - 它有问题。

我尝试在规范文件的 pathex、datas 和隐藏导入字段中指向 sql 模块。我在这三个字段中输入了诸如 'C:\\Users\\Me\\PycharmProjects\\ProjectName\\venv\\Lib\\site-packages\\mysql' 之类的文本,但仍然收到相同的错误。

我尝试使用 --hiddenimport=mysql 如下:pyinstaller --onefile --hiddenimport=mysql test.spec

在下面的例子中,我导入了mysql.connector,并在代码中随意使用。这是为了演示我在与 mysql 相关的实际程序中收到的错误。如果我事先删除 mysql.connector 或尝试导入 PyQt5,我仍然会遇到与 PyQt5 相关的错误。

最小可重复代码:

firstwindow.py

import mysql.connector
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
import subprocess
import sys

db = mysql.connector.connect()

class FirstWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.button = QPushButton("Push for Window")
        self.button.clicked.connect(self.show_new_window)
        self.setCentralWidget(self.button)

    def show_new_window(self, checked):
        subprocess.Popen("secondwindow.py", shell=True)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = FirstWindow()
    window.show()
    sys.exit(app.exec_())

secondwindow.py

import mysql.connector
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
import sys

db = mysql.connector.connect()


class NewWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.button = QPushButton("Second Window Opened")
        self.setCentralWidget(self.button)




if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = NewWindow()
    window.show()
    sys.exit(app.exec_())

测试规范

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['firstwindow.py', 'secondwindow.py'],
             pathex=['C:\\Users\\Me\\PycharmProjects\\ProjectName', 'C:\\Users\\Me\\PycharmProjects\\ProjectName\\venv\\Lib\\site-packages\\mysql'],
             binaries=[],
             datas=[('firstwindow.py', '.'), ('secondwindow.py', '.'), ('C:\\Users\\Me\\PycharmProjects\\ProjectName\\venv\\Lib\\site-packages\\mysql', '.')],
             hiddenimports=['C:\\Users\\Me\\PycharmProjects\\ProjectName\\venv\\Lib\\site-packages\\mysql'],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='firstwindow',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               upx_exclude=[],
               name='firstwindow')

后跟:pyinstaller --onefile test.spec

0 个答案:

没有答案