鱼C论坛

 找回密码
 立即注册
查看: 1527|回复: 12

[已解决]import以及exe打包问题

[复制链接]
发表于 2021-7-23 02:09:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖一共有两个问题。
请问From……import *和import在打包方式上有没有区别?
因为我发现我写的一个小程序打包成exe后竟然有50多MB!!!
  1. from tkinter import *
  2. from tkinter.ttk import *
  3. from tkinter import filedialog
  4. import time
  5. import threading
  6. import tkinter.messagebox
  7. import os
  8. from numpy import *
  9. from cv2 import *
复制代码

这是我所用到的库,我发现opencv库导入之后文件大小暴涨 ,不知道是不是跟我用了From……import *有关。
要是有关的话我怕不是要把代码翻新一遍。。。

另外一个问题。
打包的时候出现
WARNING: Hidden import "pkg_resources.py2_warn" not found!
WARNING: Hidden import "pkg_resources.markers" not found!
不过在我的电脑上可以正常运行,还没在其他电脑上试,不知道有没有实质影响,求大佬解答
如果方便的话,能不能告诉我原因以及解决方法?(我在这方面确实不懂哈,包括这个帖子,我有3个帖子都是问打包问题的)

对了,我的python版本是3.8
最佳答案
2021-7-23 09:54:54
本帖最后由 阿奇_o 于 2021-7-23 09:58 编辑

如果你用到 一个库(模块)里的 很多子模块(或方法、属性等),
你可以考虑 from A_module import *   # 意思是:我可能需要用到 这A_module里的 所有子模块(或其方法或属性),我先 全部导入
这样显然会占用更多内存(因import *而形成的变量就会比较多),你这里可以考虑一下修改:
from numpy import * ,from cv2 import *  , 这两句 是否有必要 import * ,
还有 ttk的导入,通常是 from tkinter import ttk

打包的问题,可能是版本问题吧
https://answerlib.com/question/16274/no-module-named-pkg_resourcespy2_warn-pyinstaller.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-23 08:46:56 | 显示全部楼层
我之前也遇到这种情况,后面是在低版本系统中打包,再放在其他电脑运行,程序一切正常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-23 09:29:45 | 显示全部楼层
这里涉及一个导入模块的问题:
导入模块的三种方法:
1,直接i import 模块名,这种方法就是你把整个模块都导入进来了,你导入的是这个模块所有的东西,所以在调用模块里面的函数时,就需要加上模块的命名空间,就是" 模块名 . 函数名"
2,from 模块名 import 函数名,这种方法会直接将模块的命名空间覆盖进来,这个导入的话,调用就不需要像上面一样加上模块名
3,import 模块名 as 新名字,这种导入可以给当前的命名空间起名字,调用时用你取的 新名字.函数名 就好了

而且,打包是将你关于python所有需要运行的东西放在一起,方便在没有python的环境下运行,所有打包出来50多MB是正常的,有时候100多MB也是正常的。

然后他打包的时候可能会出现些警告,这个是没有影响的,正常完成打包即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-23 09:54:54 | 显示全部楼层    本楼为最佳答案   
本帖最后由 阿奇_o 于 2021-7-23 09:58 编辑

如果你用到 一个库(模块)里的 很多子模块(或方法、属性等),
你可以考虑 from A_module import *   # 意思是:我可能需要用到 这A_module里的 所有子模块(或其方法或属性),我先 全部导入
这样显然会占用更多内存(因import *而形成的变量就会比较多),你这里可以考虑一下修改:
from numpy import * ,from cv2 import *  , 这两句 是否有必要 import * ,
还有 ttk的导入,通常是 from tkinter import ttk

打包的问题,可能是版本问题吧
https://answerlib.com/question/16274/no-module-named-pkg_resourcespy2_warn-pyinstaller.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-23 12:32:43 | 显示全部楼层
学习中... 发表于 2021-7-23 09:29
这里涉及一个导入模块的问题:
导入模块的三种方法:
1,直接i import 模块名,这种方法就是你把整个模块 ...

然而这程序在其他电脑上关键功能无法使用,能打开,但点了按钮没反应
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-23 12:35:02 | 显示全部楼层
阿奇_o 发表于 2021-7-23 09:54
如果你用到 一个库(模块)里的 很多子模块(或方法、属性等),
你可以考虑 from A_module import *   #  ...

所以说import的方式只跟内存有关吗?跟打包的exe大小无关是吧?
打包问题那个网站全是机翻,看晕了都
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-23 13:08:13 | 显示全部楼层
阿奇_o 发表于 2021-7-23 09:54
如果你用到 一个库(模块)里的 很多子模块(或方法、属性等),
你可以考虑 from A_module import *   #  ...

请问要安装什么版本呢?我升级了pyinstaller和setuptools,这次是直接报错了
7188 INFO: Analyzing hidden import 'pkg_resources.py2_warn'
7189 ERROR: Hidden import 'pkg_resources.py2_warn' not found
7189 INFO: Analyzing hidden import 'pkg_resources.markers'
7191 ERROR: Hidden import 'pkg_resources.markers' not found
,功能无法在其他电脑上使用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-23 14:37:21 | 显示全部楼层
阿奇_o 发表于 2021-7-23 09:54
如果你用到 一个库(模块)里的 很多子模块(或方法、属性等),
你可以考虑 from A_module import *   #  ...

谢谢,解决了,我找到一个资料,也用到opencv的,用的pyinstaller3.6和setuptools44.0.0的,重新弄了一个,打包过程没有出现错误了。
https://www.qedev.com/python/132373.html

另外,大佬有空的花能不能解答一下上面的问题:import的方式只跟内存有关吗?跟打包的exe大小无关是吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-23 15:55:46 | 显示全部楼层
Jerry_Green 发表于 2021-7-23 14:37
谢谢,解决了,我找到一个资料,也用到opencv的,用的pyinstaller3.6和setuptools44.0.0的,重新弄了一个 ...


版本那网站,是机器翻译stackoverflow.com的答案,有点乱,
说的是setuptools的版本问题,据说降到 44版本就行了,或升级到49+的(但有人说不行)。

至于内存那个,我没直接说到点上,程序运行时,肯定是更多的靠内存(除非你是频繁读写磁盘的程序)。
但假设你打包成一个exe文件,那比如一些需要的模块和变量,就要"持久化"或"序列化"为exe可执行文件,
这也意味,相关有依赖关系的模块或数据文件,也要成为exe文件的一部分,
从而 import * 时,要考虑是否有必要,因为这可能导致打包转为exe时,需要更多磁盘空间。

当然,你可以考虑 分开打包,让exe变小些,具体需要参考官方文档。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-23 16:03:33 | 显示全部楼层
阿奇_o 发表于 2021-7-23 15:55
版本那网站,是机器翻译stackoverflow.com的答案,有点乱,
说的是setuptools的版本问题,据说降到 44 ...

懂了,其实就是懒得输前缀直接import*了没想到这么大,下次还是不偷懒了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-23 18:40:03 | 显示全部楼层
阿奇_o 发表于 2021-7-23 15:55
版本那网站,是机器翻译stackoverflow.com的答案,有点乱,
说的是setuptools的版本问题,据说降到 44 ...

老哥,我刚刚试了,就单纯import numpy as np以及import cv2。打包文件大小还是不变啊,不过问题不大,文件大点就大点吧,无所谓了,用C++写代码直接编译这个是不是会不会好很多?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-23 20:25:51 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-7-23 20:28 编辑
Jerry_Green 发表于 2021-7-23 18:40
老哥,我刚刚试了,就单纯import numpy as np以及import cv2。打包文件大小还是不变啊,不过问 ...


傻孩子,import numpy 和 import numpy as np 或和 from numpy import *  基本上等价的。
从能不能用某些子模块的角度看,它们都是等价的,只是调用时,写法上有区别。
所以,你可以 尽量写导入那个子模块,比如 from numpy import linalg
这样是 只导入 numpy的linalg这一线性代数相关的子模块,
这样其他子模块,它可能就不用导入了,从而减少最终的占用空间。

但问题是,为什么说是 可能减少 呢?——因为具体需要的依赖关系通常比较复杂,你不知道。
而具体pyinstaller如何处理这些依赖你也不清楚,具体如何打包,你可能需要读源码或文档,才知道……

所以,你看着办,哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-23 20:43:53 | 显示全部楼层
阿奇_o 发表于 2021-7-23 20:25
傻孩子,import numpy 和 import numpy as np 或和 from numpy import *  基本上等价的。
从能不能用 ...

太感谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 14:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表