由于需要虚拟环境中各种依赖的库,在其他电脑开启本地服务,所以将Django项目进行打包,以下是各种步骤以及出错的处理

  • 安装pyinstall
    我在使用pip安装pyinstall的时候,会出现大量的红字错误,只需要按照下面的指令一个个执行就好了
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为止

把自己写的django打包成docker django项目打包成exe_包名

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同级目录,这样就不会出错了。

问题二:打开网页出现TemplateDoesNotExist 错误   解决方法:根据错误的提示消息,把项目中的模板文件templates拷贝到相应的位置,刷新页面即可。 问题三:网页丢失CSS、JS   参考的stackoverflow 网址:https://github.com/pyinstaller/pyinstaller/issues/2368   首先在项目中的settings文件中添加如下代码,其中static是笔者项目中的静态文件位置,static_root是static下的一个空文件夹,然后执行python manage.py collectstatic命令将静态文件收录到static_root中: [Shell] 纯文本查看 复制代码 ? 1 STATIC_ROOT = os.path.join(BASE_DIR, 'static', 'static_root') 然后在urls.py中添加如下代码: [Python] 纯文本查看 复制代码 ? 1 2 3 4 from django.conf.urls import static from project_1 import settings urlpatterns += static.static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 解决方法: 1、升级setuptools,pip install --upgrade setuptools 2、修改job添加方式,这是原先的 scheduler.add_job(job, 'interval', seconds=5) 这是修改后的: from apscheduler.triggers.interval import IntervalTrigger trigger = IntervalTrigger(seconds=5) scheduler.add_job(job, trigger) 再次打包后没有报错,可以正常运行了。