由于需要虚拟环境中各种依赖的库,在其他电脑开启本地服务,所以将Django项目进行打包,以下是各种步骤以及出错的处理
pip install pywin32; pip install wheel pip install -U setuptools pip install pyinstaller
执行下面两条指令,其中执行第一条后会生成一个spec文件,先不用管,等会会进行修改。第二条就是开始使用pyinstaller打包的指令
pyi-makespec -D manage.py pyinstaller manage.spec
在执行过程中,可能会出现Import Error,注意是可能在打包而不是执行的时候出现,网上大多都是说执行exe时会出现。而这里出现,他并没有说明缺的是哪个包,这个时候就要将控制台往上翻,就会翻到类似这个的错误
Import Error:No module named XXX
然后我显示缺失的包名是我Django项目中的其中一个App名,而我将app都放在了apps文件夹中,并在settings文件夹中设置了目录,导致pyinstall找不到。
解决办法就是将app都移到主目录上,settings注释掉设置目录的代码即可,操作并不复杂,之后再次执行上面那两句打包指令
pyi-makespec -D manage.py pyinstaller manage.spec
这次我就正常生成了exe文件在dict目录下,执行下面指令开启服务器
manage.exe runserver
然后又是一堆Import Error,后面会跟着缺失的包名,这个就很好解决了,打开上面提到的manage.spec文件,按照下面这个图这样加入缺失的包名。具体是为什么,简单来说是因为这些是django项目中隐式加入的,所以我们需要手动加进去。
然后就是删掉build和dict文件夹并重新打包,重新开启服务器,有时候会提示缺失多个包,有时候会只提示一个,反正重复执行到不出现Import Error为止
pyi-makespec -D manage.py pyinstaller manage.spec cd dict manage.exe runserver
我在处理完上述问题后,又出现了新的问题,主要是这两条
KeyError:'interval' LookupError: No trigger by the name "interval" was found SchedulerNotRunningError:Scheduler is not running
出现错误的地方是Django项目中有使用调度器scheduler,具体错误原因不明,但是网上有很多解决办法,其中有效的是创建一个IntervalTrigger对象代替参数
trigger = IntervalTrigger(hours=3) @register_job(scheduler,trigger) def my_job(): #省略
同样适用于add_job
上面的问题处理完后,就可以正常开启本地服务器了,但是却访问不了页面,因为模板等都没有复制过去,如果有第三方库也用到html、css、js文件等,可以直接将第三方库地文件夹复制到exe同级目录,这样就不会出错了。