У меня странная проблема с приложением Python3 / PyQT5, замороженным с помощью PyInstaller.На macOS код работает из CLI.Версия, замороженная с помощью PyInstaller, также успешно запускается, но каждые несколько секунд создает новые копии в виде бесконечного цикла.Что может вызвать такое поведение?
В качестве фона я успешно заморозил это приложение на Ubuntu 18.05 и Windows 10, не увидев этой проблемы.
Я запускаю Python 3.7.2 с PyInstaller 3.4и PyQT5 5.12, на macOS Mojave 10.14.3.
Учитывая, что код Python отлично запускается из CLI и из PyCharm, а замороженный пакет запускается (но с несколькими собственными копиями), похоже, что проблема где-тов процессе замораживания.
Файл .spec PyInstaller, который я использую, находится здесь:
# -*- 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 Я теперь сузил причину этой проблемы.Я могу подтвердить, что выполнение однострочного скрипта:
import sklearn
, замороженного с помощью PyInstaller, вызывает бесконечный цикл.Добавление исключения в файл .spec PyInstaller:
excludes=['sklearn.externals.joblib']
устраняет проблему.Основная проблема заключается в том, что зависание приложения, вызывающего joblib, вызывает бесконечный цикл.Вы можете доказать это, заморозив 1-строчный скрипт
import joblib
, и вы увидите, что это вызывает бесконечный цикл.Мое приложение не вызывает joblib напрямую, но использует функции машинного обучения в sklearn.К сожалению, sklearn вызывает joblib, и это то, что заставляет мое приложение зацикливаться в замороженном состоянии.Это похоже на ошибку в PyInstaller.Кто-нибудь может предложить обходной путь?