pyinstaller打包多线程pyqt5程序后,报错,反复弹窗等问题

报错1:
Traceback (most recent call last):
File “MPL.py”, line 502, in
File “Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_multiprocessing.py”, line 45, in _freeze_support
ValueError: not enough values to unpack (expected 2, got 1)

报错2:
!!! Traceback (most recent call last):
File “MPL_0.py”, line 46, in run
File “MPL\Master.py”, line 177, in train
File “MPL\Model_interpretation.py”, line 85, in call
File “MPL\Model_interpretation.py”, line 147, in gini_perm
File “sklearn\utils_param_validation.py”, line 213, in wrapper
File “sklearn\inspection_permutation_importance.py”, line 292, in permutation_importance
File “sklearn\utils\parallel.py”, line 67, in call
File “joblib\parallel.py”, line 1854, in call
File “joblib\parallel.py”, line 1332, in _initialize_backend
File “joblib_parallel_backends.py”, line 550, in configure
File “joblib\executor.py”, line 20, in get_memmapping_executor
File “joblib\executor.py”, line 42, in get_memmapping_executor
File “joblib_memmapping_reducer.py”, line 535, in init
File “joblib_memmapping_reducer.py”, line 539, in set_current_context
File “joblib_memmapping_reducer.py”, line 564, in register_new_context
File “joblib_memmapping_reducer.py”, line 580, in register_folder_finalizer
File “joblib\externals\loky\backend\resource_tracker.py”, line 178, in register
File “joblib\externals\loky\backend\resource_tracker.py”, line 95, in ensure_running
File “joblib\externals\loky\backend\resource_tracker.py”, line 170, in _check_alive
File “joblib\externals\loky\backend\resource_tracker.py”, line 197, in _send
OSError: [Errno 22] Invalid argument !!!

这个错误信息显示了在运行一个使用 joblibsklearn(scikit-learn)的机器学习管道时遇到的问题。具体来说,错误发生在计算模型特征重要性时,更准确地说是在使用 permutation_importance 函数时。此问题似乎涉及到 joblib 在尝试使用它的内存映射(executor)功能进行并行计算时的资源跟踪器。

错误 “OSError: [Errno 22] Invalid argument” 指示了某种形式的无效参数被传递到系统调用中。这可能是由多种原因造成的,包括但不限于:

  1. 环境问题: 可能与你的操作系统或环境设置有关,尤其是涉及文件系统和权限的。

  2. 资源限制: 系统资源限制(如文件描述符数量、内存等)可能导致此错误。

  3. joblib的版本问题: 某些版本的 joblib 可能与其他库不兼容或存在已知的bug。

要解决这个问题,你可以尝试以下方法:

  • 环境检查: 确保你的操作系统和环境配置正确。如果你在容器(如Docker)中运行代码,确保容器配置允许足够的资源使用并正确配置了临时文件存储。

  • 更新库: 确保所有相关的库,包括 joblibsklearn,都更新到最新版本。不同版本之间的不兼容可能会导致奇怪的错误。

    pip install --upgrade joblib scikit-learn
    
  • 资源限制: 检查你的系统资源限制,尤其是如果你在一个受限或共享资源的环境下工作。在某些系统上,你可能需要调整ulimit设置或类似的配置来增加可用资源。

  • 简化问题: 尝试简化代码以隔离问题。例如,先用非常小的数据集运行代码,看看问题是否仍然存在。

  • 并行设置: 如果使用 joblib 进行并行处理,尝试调整并行执行的参数,比如减少并行工作的数量。这有时可以避免资源竞争或限制导致的问题。

    from sklearn.inspection import permutation_importance
    
    # 减少n_jobs的数量
    result = permutation_importance(model, X, y, n_jobs=1)
    
  • 探索替代方案: 如果可能,探索替代的实现方法。虽然 permutation_importance 提供了一种方便的方式来评估特征的重要性,但也许你可以找到或实现一个更适合你特定环境的方法。

如果上述方法都不能解决问题,建议查阅 joblibsklearn 的文档或社区寻求更具体的帮助,可能需要更深入的调查来解决这个问题。

**

以上两次错误是在打包pyqt5中包含QThread情况下使用pyinstaller打包后运行exe文件时遇到的,具体错误原因不详,但已经通过两个方法合并修改得以解决:

**

方法一(参考多线程打包):利用Pyinstaller打包一个完整的python项目及注意事项

方法二: 就是上面提到的,修改“并行设置”,将permutation_importance(model, X, y, n_jobs=1)中的n_jobs值改为1,这样来避免窗体外的线程触发(如图)。
在这里插入图片描述
上面这个图示就是我当时代码的问题位置,里面的n_jobs为2,我改为1之后,就避免了窗体外线程触发,这也是导致反复弹窗和导致内存资源不足的原因

如果你也遇到同我一样的问题,并能得到我的帮助,是我的荣幸。

最后,也请不吝赐赞,谢谢!

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菌菌的快乐生活

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值