pyinstaller打包Django项目成为exe程序

1.环境

win10 + Python3.6 + Django (2.1.10) + PyInstaller (4.2)

  1. 安装

方式一:在线安装

pip install pyinstaller
此处我是直接在我的虚拟环境在线安装
#方式二:离线安装
future-0.18.2.tar.gz
pefile-2019.4.18.tar.gz
altgraph-0.17-py2.py3-none-any.whl
pywin32_ctypes-0.2.0-py2.py3-none-any.whl
pyinstaller-4.0.tar.gz

2.制作项目的.spec文件

进入到项目的所在的路径中,执行如下命令生成 .spec文件,文件位于当前路径下

pyi-makespec -D manage.py

manage.spec文件 示例


```python
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
​
a = Analysis(['manage.py'],
             pathex=['F:\\Work\\Code\\project_1'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='manage',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               upx_exclude=[],
               name='manage')
3、生成exe文件
继续运行如下命令,生成打包的exe文件
pyinstaller manage.spec
打包程序的运行方式,我的路径F:\projects\kb\dist\manage,此时也可以把dist文件夹放其他路径实验啦

```python
# 在manage.exe的位置打开cmd,输入如下命令,运行服务即可
manage.exe runserver

4、总结
我遇到的问题:提示templates下的页面加载错误,找不到文件,我的已经解决了,用的网上的截图在这里插入图片描述
按照图示的路径,把templates文件夹手动添加过去,再次运行就可以了
前辈遇到的问题:
问题1:运行服务是会提示No module named XXX

这是因为Django有些module不会自动收集,需要手动添加
解决方法:在manage.spec文件中修改hiddenimports=[]为hiddenimports=[‘users’,‘users.apps’,‘sql_server.pyodbc.compiler’],提示缺少什么module就在此处添加什么。
问题2:打开网页出现TemplateDoesNotExist 错误

解决方法:根据错误的提示消息,把项目中的模板文件templates拷贝到相应的位置,刷新页面即可。
问题3:网页丢失CSS、JS

1、首先在项目中的settings文件中添加如下代码,其中static是项目中的静态文件位置,static_root是static下的一个空文件夹,然后执行python manage.py collectstatic命令将静态文件收录到static_root中

STATIC_ROOT = os.path.join(BASE_DIR, ‘static’, ‘static_root’)
2、然后在urls.py中添加如下代码:

from django.conf.urls import static
from project_1 import settings

urlpatterns += static.static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

3.我们可以发现能够打包成功,但是在manage.exe所在路径下,在cmd中运行manage.exe runserver,会发现以下错误:
ImportError: No module named admin
这种错误的原因是 django.contrib.admin在django项目中是隐式导入的,所以pyinstaller打包时,并不能识别这种库或者模块,导致打包出来的.exe中并不包括这样隐式导入的库。
如果碰到这样的错误,只需要将这个库添加到.spec文件中的hiddenimports中即可。在接下来打包django项目缺少很多这样的隐式库,所以我.spec文件中一并修改了,修改如下:(如果缺少什么,直接在hiddenimports中加就可以了)
4.发现页面没有css和js了
这是因为Pyinstaller 能找到templates(html files文件),但不能找到css和js文件。
我的解决方案是参考了以下 :https://github.com/pyinstaller/pyinstaller/issues/2368
我的具体操作是在django项目的settirngs.py文件中加入

STATIC_ROOT = os.path.join(BASE_DIR, 'front', 'static_root')

其中front是我的文件夹,static_root是我在front下创建的一个空子文件,用来收集工程中所有的静态文件。
在django项目路径下执行manage.py collectstatic会自动地将STATICFILES_DIRS列出的目录以及各个App下的static子目录的所有文件复制到STATIC_ROOT。因为复制过程可能会覆盖掉原来的文件,所以,一定不能把我们辛苦做出来静态文件放这边!
然后来到urls.py文件下,加入下面的一句话,加入的同时要导入static库

from django.conf.urls import static
urlpatterns += static.static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

这句话的意思就是将STATIC_ROOT目录的静态文件复制一份到网页 STATIC_URL路径下

最后我们还需要将STATIC_ROOT中的静态文件打包到.exe中。这一步是在.spec文件中的datas中加入下面一个元组

datas=[(r'E:\G48\G48\front\static_root',r'.\front\static_root'), (r'E:\G48\G48\front\templates', r'.\front\templates')],

在这里插入图片描述
一切准备好后,执行下面语句就OK
pyinstaller manage.spec
如果在项目中有多进程,可以参考以下
https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Multiprocessinghttps://stackoverflow.com/questions/24944558/pyinstaller-built-windows-exe-fails-with-multiprocessing
————————————————
版权声明:本文为CSDN博主「px_cmd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34809033/article/details/81873896

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值