python - Pyinstaller PyQt5 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 相关的错误。
最小可重现代码:
第一个窗口.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_())
第二个窗口.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
解决方案
推荐阅读
- r - 当我尝试使用 rvest 抓取 mlb.com 交易时没有返回任何内容
- java - 为什么经过几次迭代后 Bufferedimage 等于 null?
- regex - 从文本中提取文本(单词)和 IP 地址
- jooq - 有没有办法生成带有内联和索引参数的查询字符串?
- ios - 如何实现平移手势以折叠展开的 collectionview 单元格?
- javascript - 如何使用 Axios 向 POST 请求添加数据?
- c# - 通过 Startup 类启动客户端控制台应用程序
- html - 如何让页面/发布特色图片显示在 Twitter 卡上?雨果(学术主题)
- express - 如何使用 Async 在 Express 中用子对象实例化对象?
- ios - 如果注释标注与另一个注释重叠,则无法点击它?