我正在尝试使用 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