Приложение PyQt5 / PyInstaller открывает несколько копий в бесконечном цикле на OSX - PullRequest
0 голосов
/ 01 марта 2019

У меня странная проблема с приложением 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.Кто-нибудь может предложить обходной путь?

...