本篇博客主要介绍的是pyinstaller在windows下的基本使用和基础避坑
在windows中使用pyinstaller工具打包时会出现一个问题,在打包列表会看到这样的警告信息:
django.core.exceptions.ImproperlyConfigured: Could not find the GDAL library (tried "gdal302", "gdal30 1", "gdal300", "gdal204", "gdal203", "gdal202", "gdal201", "gdal20"). Is GDAL installed? If it is, try setting GDAL_LIBRARY_PATH in your settings. collect_submodules: failed to import 'django.contrib.gis.sitemaps'!
这种信息不予理会就好了。
一、基本使用1、安装pyinstall
# pip install pyinstaller
2、查找程序需要的文件
# 制作 .spec 文件 # 进入项目目录,执行命令:(还有其它参数:-F等, 建议使用-D) # -D会在当前目录下的dist目录中生成文件夹,处理静态文件时比较方便 # pyi-makespec -D manage.py
3、生成.exe文件
# 在manage.spec 同级目录执行 # pyinstaller manage.spec
4、进入dist目录运行项目
# 生成的exe可执行文件 runserver --noreload # manage.exe runserver --noreload二、基本错误处理
1、当运行exe后出现提示:No module named XXX
**出现原因:**出现这种情况的原因主要是由于Django有些module不会自动收集,需要手动添加
解决办法:打开生成的后缀名为.spec的文件,在hiddenimports中添加报错中没有的模块
2、当运行出现报错:UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 658: illegal multibyte
**出现原因:**主要是windows系统下gbk编码的问题
**解决办法:**打开报错信息上面一行提示的错误文件并跳转到提示的错误行数上修改with open(),在里面添加:encoding=‘utf-8’ 即可
During handling of the above exception, another exception occurred: Traceback (most recent call last): File "threading.py", line 890, in _bootstrap File "threading.py", line 936, in _bootstrap_inner File "traceback.py", line 167, in format_exc File "traceback.py", line 121, in format_exception File "traceback.py", line 521, in __init__ File "traceback.py", line 533, in _load_lines File "traceback.py", line 533, in _load_lines File "traceback.py", line 533, in _load_lines [Previous line repeated 2 more times] File "traceback.py", line 531, in _load_lines File "traceback.py", line 285, in line File "linecache.py", line 16, in getline File "linecache.py", line 47, in getlines File "linecache.py", line 103, in updatecache File "PyInstallerloaderpyimod03_importers.py", line 299, in get_source UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 11211: illegal multibyte sequence
上面是报错示例,找到**“PyInstallerloaderpyimod03_importers.py”**文件,打开并编译第299行找到对应位置添加:encoding=‘utf-8’(注:修改前先备份好备份,以免误 *** 作找不回)
3、当运行出现这种报错:TemplateDoesNotExist at /index/
**出现原因:**TemplateDoesNotExist 这个是因为没有找到templates文件
**解决办法:**根据错误提示将templates文件添加至对应的路径下,刷新即可。
TemplateDoesNotExist at /index/ index/index.html Request Method: GET Request URL: http://127.0.0.1:8000/index/ Django Version: 3.2.9 Exception Type: TemplateDoesNotExist Exception Value: index/index.html Exception Location: djangotemplateloader.py, line 19, in get_template Python Executable: F:WorkspoacePyWorkbookstoredistmanage.exe Python Version: 3.7.8 Python Path: ['C:\Users\ja\AppData\Local\Temp\_MEI25882\base_library.zip', 'C:\Users\ja\AppData\Local\Temp\_MEI25882\lib-dynload', 'C:\Users\ja\AppData\Local\Temp\_MEI25882'] Server time: Tue, 16 Nov 2021 03:13:35 +0000 Template-loader postmortem Django tried loading these templates, in this order: Using engine django: django.template.loaders.filesystem.Loader: C:UsersjaAppDataLocalTemp_MEI25882templatesindexindex.html (Source does not exist) django.template.loaders.app_directories.Loader: C:UsersjaAppDataLocalTemp_MEI25882djangocontribadmintemplatesindexindex.html (Source does not exist) django.template.loaders.app_directories.Loader: C:UsersjaAppDataLocalTemp_MEI25882djangocontribauthtemplatesindexindex.html (Source does not exist)
上面这种示例把template文件夹复制下来放到**C:UsersjaAppDataLocalTemp_MEI25882**下面即可
4、项目缺少样式css和js
**出现原因:**Pyinstaller 能找到templates(html files文件),但不能找到css和js文件
解决办法:
在settings中配置django静态文件收集
# STATIC_ROOT = os.path.join(base_DIR, '文件夹路径')
静态文件收集命令
# python manage.py collectstatic
然后在各个app的url中添加:
# static.static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) # 这句话的意思就是将STATIC_ROOT目录的静态文件复制一份到网页 STATIC_URL路径下
在.spec文件中修改datas,配置静态文件打包:
# F:WorkspoacePyWorkbookstorestatics 要打包的css,js静态文件地址 相对应打包到dist中的位置 # F:WorkspoacePyWorkbookstoretemplates 要打包的html文件模板地址 相对应打包到dist中的位置 # datas=[(r'F:WorkspoacePyWorkbookstorestatics',r'.statics'), (r'F:WorkspoacePyWorkbookstoretemplates', r'.templates')],
注:这里配置template打包上面的第3条文件迁移就不需要做了,这里同步打包了。
这里还存在一个小问题就是django的配置文件settings中:
# STATICFILES_DIRS = [ # os.path.join(base_DIR, "statics"), # ] STATIC_ROOT = os.path.join(base_DIR, 'statics')
STATICFILES_DIRS和STATIC_ROOT不能同时使用,如果配置了STATICFILES_DIRS需要注释掉,不然会报错。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)