PyQt5 / PyInstaller应用在OSX上无休止地打开多个副本

时间:2019-03-01 10:42:50

标签: python-3.x macos pyqt5 pyinstaller

我在使用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中的错误。有人可以建议解决方法吗?

0 个答案:

没有答案