pyinstaller打包遇到的问题解决

作者:一世繁华行 时间:2021-07-22 07:56:24 

1、ModuleNotFoundError: No module named ‘scipy.spatial.transform_rotaion_groups’

pyinstaller打包遇到的问题解决

解决办法:–hidden-import scipy.spatial.transform._rotation_groups

2、FileNotFoundError:[Errno 2] No such file or directory:‘C:\Users\Gw0021\AppData\Local\Temp\_MEI149922\matplotlib\npl-data\matplotlibrc’

pyinstaller打包遇到的问题解决

解决办法:
pip uninstall matplotlib
pip install matplotlib==3.1.3

3、Failed to execute script ‘app‘ due to unhandled exception已解决

参考解决方法:[Failed to execute script ‘app‘ due to unhandled exception](https://blog.csdn.net/qq_25262697/article/details/127991930?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2~default~OPENSEARCH~Rate-2-127991930-blog-122015848.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~OPENSEARCH~Rate-2-127991930-blog-122015848.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=3)

一、说明

关于Pyinstaller,可以查看Python打包发布1(基于Pyinstaller打包多目录项目)

Pyinstaller可以将资源文件一起打包到exe中,当exe在运行时,会生成一个临时文件夹,程序可通过sys._MEIPASS访问临时文件夹中的资源。
程序打包成exe的时,会将一个变量frozen注入到sys中,这里使用判断,检测sys是否有frozen这个变量,如果有,就使用sys._MEIPASS访问临时文件夹路径,如果没有,就使用当前路径,当程序不管是以PyInstaller打包后形式运行,还是本地测试,都能找到正确的资源路径。

二、测试

本项目,目录为:

- MyProject
- In
- Out
- App
- __init__.py
- app.py
- MainProgram
- __init__.py
- 1.py
- 2.py
- main.py

可以修改main.py,添加

import os,sys
print(sys)
print(sys.executable)

未打包时运行,打印结果分别为:
sys加粗样式

['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', '__unraisablehook__', '_base_executable', '_clear_type_cache', '_current_frames', '_debugmallocstats', '_enablelegacywindowsfsencoding', '_framework', '_getframe', '_git', '_home', '_xoptions', 'addaudithook', 'api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix', 'breakpointhook', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth', 'getallocatedblocks', 'getcheckinterval', 'getdefaultencoding', 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'getwindowsversion', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'is_finalizing', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'pycache_prefix', 'set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info', 'unraisablehook', 'version', 'version_info', 'warnoptions', 'winver']

sys.executable

C:\ProgramData\Anaconda3\envs\nuitka\python.exe

pyinstaller打包后,打印结果分别为:

['_MEIPASS', '__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__', '__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', '__unraisablehook__', '_base_executable', '_clear_type_cache', '_current_frames', '_debugmallocstats', '_enablelegacywindowsfsencoding', '_framework', '_getframe', '_git', '_xoptions', 'addaudithook', 'api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix', 'breakpointhook', 'builtin_module_names', 'byteorder', 'call_tracing', 'copyright', 'displayhook', 'dllhandle', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'frozen', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth', 'getallocatedblocks', 'getdefaultencoding', 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'getwindowsversion', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'is_finalizing', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'platlibdir', 'prefix', 'pycache_prefix', 'set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info', 'unraisablehook', 'version', 'version_info', 'warnoptions', 'winver']

可以看到多了’_MEIPASS’,‘frozen’
sys.executable
此时路径为app.exe

\APP\dist\app.exe

三、解决思路

根据自己目录的相对位置进行修改
pyinstaller打包后运行时,输出sys.executable的路径。py运行时输出__file__

# pyinstaller
def app_path():
   # Returns the base application path.
   if hasattr(sys, 'frozen'):
       # Handles PyInstaller
       return sys.executable  #使用pyinstaller打包后的exe目录
   return os.path.dirname(__file__)     #没打包前的py目录

自行调整项目路径

pj_path = os.path.abspath(os.path.dirname(os.path.dirname(os.path.abspath(app_path()))))
print(f"================Project dir is '{pj_path}'===============")

来源:https://blog.csdn.net/jianglianye21/article/details/120307712

标签:pyinstaller,打包
0
投稿

猜你喜欢

  • 浅谈如何重构冗长的Python代码

    2021-11-13 05:48:27
  • 纯ASP结合VML生成完美图-柱图

    2010-05-11 16:48:00
  • python中使用ctypes调用so传参设置遇到的问题及解决方法

    2021-06-02 00:38:39
  • MySQL常用维护管理工具

    2009-03-08 16:51:00
  • Python dict的常用方法示例代码

    2023-05-17 09:58:15
  • Python时间序列缺失值的处理方法(日期缺失填充)

    2023-04-13 07:39:18
  • go-micro微服务domain层开发示例详解

    2024-04-26 17:25:04
  • 在python中将list分段并保存为array类型的方法

    2023-11-15 10:18:00
  • 100行Python代码实现每天不同时间段定时给女友发消息

    2023-07-11 20:32:56
  • Python面向对象编程之封装的艺术你了解吗

    2022-04-26 22:07:24
  • Python turtle画图库&&画姓名实例

    2021-07-03 09:02:02
  • MySQL 启动成功但未监听端口的解决方法

    2024-01-29 00:01:55
  • python基础之类型转换函数

    2021-06-25 02:43:27
  • Python实现pdf文档转txt的方法示例

    2021-12-08 19:16:16
  • 原生JS实现九宫格抽奖效果

    2024-04-17 10:33:38
  • JavaScript中的函数声明和函数表达式区别浅析

    2023-08-05 23:22:36
  • javascript自动生成包含数字与字符的随机字符串

    2024-04-17 09:45:29
  • Windows下MySQL安全权限设置方法

    2009-07-30 08:32:00
  • python计算一个序列的平均值的方法

    2023-08-25 06:40:17
  • javascript forEach通用循环遍历方法

    2024-04-29 13:19:14
  • asp之家 网络编程 m.aspxhome.com