偶有特殊要求可能需要將django程序打包成exe可執(zhí)行文件,方便在電腦直接點(diǎn)擊運(yùn)行随闪。這里用的是打包python代碼的常用庫(kù)Pyinstaller. 雖然用Pyinstaller支持打包Django,但也存在一些坑彩届,在此記錄一下店诗。
環(huán)境:
- Python 3.6
- Django 2.0
- Pyinstaller 3.4
打包開始之前压固,先確定寫的django程序能否正常運(yùn)行腮介。確定無誤后在開始打包。Pyinstaller 打包你可以選擇打包成一個(gè)exe可執(zhí)行文件斗埂,或者是一個(gè)文件夾符糊,包含許多配置文件。對(duì)于簡(jiǎn)單的腳本呛凶,不含其它第三方庫(kù)男娄,打包成一個(gè)exe執(zhí)行文件倒是個(gè)不錯(cuò)的選擇。不過對(duì)于復(fù)雜點(diǎn)的程序,比如django之類的模闲,最好不要選擇打包成一個(gè)可執(zhí)行文件建瘫,這不是一個(gè)明智的選擇。
ModuleNotFoundError
用pyinstaller打包django時(shí)尸折,會(huì)有許多Module不會(huì)被自動(dòng)找到而打包成功啰脚,比如打包完后運(yùn)行常常出現(xiàn)這樣的錯(cuò)誤:ModuleNotFoundError: No module named 'XXXXX'
面對(duì)這樣的問題,最好的方法就是缺啥補(bǔ)啥实夹,假設(shè)打包后的目錄結(jié)構(gòu)如下橄浓,django-app
是打包的文件夾名
|—— build/
|—— dist/
|—— django-app/
|——aa
|——bb
|——nn
在系統(tǒng)文件夾中找到相應(yīng)的模塊,將其復(fù)制亮航,粘貼到django-app
內(nèi)荸实,完美解決問題。這也是打包成文件夾形式的好處之一缴淋。
app莫名消失
上面這種問題還好泪勒,他給出了錯(cuò)誤提示。遇到最坑的問題是宴猾,他打包django程序時(shí)圆存,不會(huì)自動(dòng)將app里的代碼文件給也打包。
正常應(yīng)該是這樣的仇哆。
|—— dist/
|—— django-app/
|——appA
|——migrations/
|——__init__.py
|——models.py
|——......
|——views.py
|——bb
|——nn
他打包后是這樣的沦辙,app里只有一個(gè)migrations文件夾,沒有其它代碼文件讹剔。運(yùn)行后油讯,在瀏覽器上看不到app。當(dāng)時(shí)一直在想辦法啊延欠,最后無意中點(diǎn)進(jìn)app文件夾才發(fā)現(xiàn)這個(gè)問題陌兑,一句mmp臥槽。
|—— dist/
|—— django-app/
|——appA
|——migrations/
|——bb
|——nn
TemplateNotFound
如果有Template由捎,static,等靜態(tài)文件兔综,同樣是將其復(fù)制到 打包后的文件夾內(nèi)。
其它
當(dāng)時(shí)還遇到其它問題狞玛,不過當(dāng)時(shí)沒記錄软驰,現(xiàn)在打包也沒遇到之前的問題。在打包程序完后心肪,會(huì)生成一個(gè)spec
文件锭亏,在里面可以設(shè)置打包名字,隱藏模塊導(dǎo)入硬鞍,靜態(tài)文件等等慧瘤。不過我試了隱藏模塊導(dǎo)入戴已,這個(gè)功能不太好使,有時(shí)還是直接復(fù)制粘貼方便锅减。恭陡。。還有設(shè)置pyinstaller的hook文件也可以主動(dòng)尋找隱藏模塊打包上煤,不過我沒試過。
其它文章