flask pyinstaller打包exe,出现module not found问题
最近大作业要做一个项目要打包成可执行程序,这里说一下这个module not found问题,并提供几种可能的方案,如果严格按照这些来走就能解决常见问题,剩下的神仙问题建议问问ai或者清缓存重试
首先说一下目录问题,这应该是包括我(打包app.py)在内的大多数人遇见该报错问题的原因,提出两个原则:
1.依赖的文件/导入的库都放在app.py根目录backend下,因为打包的时候默认只会搜索这个路径,当然也有方法加入更深层的目录,但是不在这个讨论范围
2.根目录backend没有__init__,其他导入文件夹eg. my_utils有__init__文件,这种时候使用 from my_utils.entity import xxx,如果backend也有__init__,那么就应该使用 from backend.my_utils.entity import xxx 了
前置知识: python的模块的标准写法是文件夹下面有一个__init__.py文件,空文件也行,但是要有,这时IDE会把源文件夹图标显示成带有一个点的文件夹图标
,表示识别为模块文件夹,
但是这对是IDE无所谓的,使用from my_utils.entity import xxx的时候IDE不管你有没有__init__,都可以正常导入,但是打包的时候没有__init__就是不行的,具体原因似乎是IDE的路径搜索机制更加宽松
图1 正确的一种目录展示
附: 使用共享文件夹时,简单的做法直接使用就行--add-data指定参数就行,但是如果要能读能写,建议使用 base_path = os.path.dirname(sys.executable) ,这是生成的exe文件夹,举个例子
if getattr(sys, 'frozen', False): #打包后会有这个frozen属性,IDE里面运行是没有的base_path = os.path.dirname(sys.executable) # 打包后临时路径
else:base_path = os.path.dirname(os.path.abspath(__file__)) # 开发环境路径static_folder_path = os.path.join(base_path, 'your_folder_name')