我在使用PyInstaller冻结的Python3 / PyQT5应用程序中遇到了一个奇怪的问题。在macOS上,该代码可从CLI正常运行。使用PyInstaller冻结的版本也可以成功运行,但是每隔几秒钟就会在无限循环中创建其自身的新副本。可能导致这种行为的原因是什么?
通过背景,我已经成功在Ubuntu 18.05和Windows 10上冻结了该应用程序,而没有看到此问题。
我正在macOS Mojave 10.14.3上运行带有PyInstaller 3.4和PyQT5 5.12的Python 3.7.2。
鉴于Python代码可以从CLI和PyCharm完美运行,并且冻结的程序包运行(但具有多个副本),看来问题出在冻结过程中。
我正在使用的PyInstaller .spec文件在这里:
# -*- mode: python -*-
import sys
import os
block_cipher = None
def get_assets():
data_files = []
for file_name in os.listdir('/Users/xxx/PycharmProjects/jbrd2/jbrd/assets'):
data_files.append((os.path.join('jbrd/assets', file_name), 'assets'))
data_files.append(('/Users/xxx/PycharmProjects/jbrd2/jbrd/jbrdclasses.py', '.'))
data_files.append(('/Users/xxx/PycharmProjects/jbrd2/jbrd/assets/config.ini', 'assets'))
data_files.append(('/Users/xxx/PycharmProjects/jbrd2/jbrd/python_mysql_connect2.py', '.'))
data_files.append(('/Users/xxx/PycharmProjects/jbrd2/jbrd/python_mysql_dbconfig.py', '.'))
return data_files
a = Analysis(['jbrd/main.py'],
pathex=['/Users/xxx/PycharmProjects/jbrd2'],
binaries=[],
datas=get_assets(),
hiddenimports=['sklearn.naive_bayes','simpleeval', 'configparser', 'mysql.connector'],
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,
a.binaries,
a.zipfiles,
a.datas,
[],
name='jbrd',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=False,
icon='/jbrd.ico')
# Build a .app if on OS X
if sys.platform == 'darwin':
app = BUNDLE(exe,
name='jbrd.app',
icon=None,
bundle_identifier=None,
info_plist={
'NSHighResolutionCapable': 'True'
},
)
对于导致应用程序运行其自身多个副本的原因,我感到困惑。有什么建议吗?
感谢1的帮助,现在我缩小了导致此问题的原因。 我可以确认运行1行脚本:
import sklearn
使用PyInstaller冻结会导致无限循环。将排除项添加到PyInstaller .spec文件中:
excludes=['sklearn.externals.joblib']
解决了问题。潜在的问题是,冻结调用Joblib的应用程序会导致无限循环。您可以通过冻结1行脚本来证明这一点
import joblib
,您将看到这会导致无限循环。 我的应用程序不直接调用joblib,而是使用sklearn中的机器学习功能。不幸的是,sklearn调用joblib,这是导致我的应用程序冻结时循环的原因。这似乎是PyInstaller中的错误。有人可以建议解决方法吗?