import以及exe打包问题
本帖一共有两个问题。{:10_254:}请问From……import *和import在打包方式上有没有区别?
因为我发现我写的一个小程序打包成exe后竟然有50多MB!!!
from tkinter import *
from tkinter.ttk import *
from tkinter import filedialog
import time
import threading
import tkinter.messagebox
import os
from numpy import *
from cv2 import *
这是我所用到的库,我发现opencv库导入之后文件大小暴涨{:10_245:} ,不知道是不是跟我用了From……import *有关。
{:10_243:} 要是有关的话我怕不是要把代码翻新一遍。。。
另外一个问题。
打包的时候出现
WARNING: Hidden import "pkg_resources.py2_warn" not found!
WARNING: Hidden import "pkg_resources.markers" not found!
不过在我的电脑上可以正常运行,还没在其他电脑上试,不知道有没有实质影响,求大佬解答{:10_254:}
如果方便的话,能不能告诉我原因以及解决方法?(我在这方面确实不懂哈,包括这个帖子,我有3个帖子都是问打包问题的)
对了,我的python版本是3.8 我之前也遇到这种情况,后面是在低版本系统中打包,再放在其他电脑运行,程序一切正常 这里涉及一个导入模块的问题:
导入模块的三种方法:
1,直接i import 模块名,这种方法就是你把整个模块都导入进来了,你导入的是这个模块所有的东西,所以在调用模块里面的函数时,就需要加上模块的命名空间,就是" 模块名 . 函数名"
2,from 模块名 import 函数名,这种方法会直接将模块的命名空间覆盖进来,这个导入的话,调用就不需要像上面一样加上模块名
3,import 模块名 as 新名字,这种导入可以给当前的命名空间起名字,调用时用你取的 新名字.函数名 就好了
而且,打包是将你关于python所有需要运行的东西放在一起,方便在没有python的环境下运行,所有打包出来50多MB是正常的,有时候100多MB也是正常的。
然后他打包的时候可能会出现些警告,这个是没有影响的,正常完成打包即可
本帖最后由 阿奇_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 学习中... 发表于 2021-7-23 09:29
这里涉及一个导入模块的问题:
导入模块的三种方法:
1,直接i import 模块名,这种方法就是你把整个模块 ...
然而这程序在其他电脑上关键功能无法使用,能打开,但点了按钮没反应{:10_243:} 阿奇_o 发表于 2021-7-23 09:54
如果你用到 一个库(模块)里的 很多子模块(或方法、属性等),
你可以考虑 from A_module import * #...
所以说import的方式只跟内存有关吗?跟打包的exe大小无关是吧?
打包问题那个网站全是机翻,看晕了都{:10_285:} 阿奇_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
{:10_285:},功能无法在其他电脑上使用 阿奇_o 发表于 2021-7-23 09:54
如果你用到 一个库(模块)里的 很多子模块(或方法、属性等),
你可以考虑 from A_module import * #...
谢谢,解决了,我找到一个资料,也用到opencv的,用的pyinstaller3.6和setuptools44.0.0的,重新弄了一个,打包过程没有出现错误了。
https://www.qedev.com/python/132373.html
{:10_282:}
另外,大佬有空的花能不能解答一下上面的问题:import的方式只跟内存有关吗?跟打包的exe大小无关是吗? Jerry_Green 发表于 2021-7-23 14:37
谢谢,解决了,我找到一个资料,也用到opencv的,用的pyinstaller3.6和setuptools44.0.0的,重新弄了一个 ...
版本那网站,是机器翻译stackoverflow.com的答案,有点乱,
说的是setuptools的版本问题,据说降到 44版本就行了,或升级到49+的(但有人说不行)。
至于内存那个,我没直接说到点上,程序运行时,肯定是更多的靠内存(除非你是频繁读写磁盘的程序)。
但假设你打包成一个exe文件,那比如一些需要的模块和变量,就要"持久化"或"序列化"为exe可执行文件,
这也意味,相关有依赖关系的模块或数据文件,也要成为exe文件的一部分,
从而 import * 时,要考虑是否有必要,因为这可能导致打包转为exe时,需要更多磁盘空间。
当然,你可以考虑 分开打包,让exe变小些,具体需要参考官方文档。
阿奇_o 发表于 2021-7-23 15:55
版本那网站,是机器翻译stackoverflow.com的答案,有点乱,
说的是setuptools的版本问题,据说降到 44 ...
懂了,其实就是懒得输前缀直接import*了{:10_282:}没想到这么大,下次还是不偷懒了。 阿奇_o 发表于 2021-7-23 15:55
版本那网站,是机器翻译stackoverflow.com的答案,有点乱,
说的是setuptools的版本问题,据说降到 44 ...
老哥,我刚刚试了,就单纯import numpy as np以及import cv2。打包文件大小还是不变啊{:10_285:},不过问题不大,文件大点就大点吧,无所谓了,用C++写代码直接编译这个是不是会不会好很多? 本帖最后由 阿奇_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如何处理这些依赖你也不清楚,具体如何打包,你可能需要读源码或文档,才知道……
所以,你看着办,哈哈 阿奇_o 发表于 2021-7-23 20:25
傻孩子,import numpy 和 import numpy as np 或和 from numpy import *基本上等价的。
从能不能用 ...
太感谢了{:10_254:}
页:
[1]