pyinstaller打包django项目的实现步骤

作者:px_cmd 时间:2022-08-17 14:28:15 

安装pyinstaller


pip install pyinstaller

制作项目的.spec文件
  进入django项目所在路径,运行


pyi-makespec -D manage.py

   在路径下,生成一个.spec文件以文本的方式打开.spec文件,spec文件格式如下。具体spec的使用,可以查看官网
https://pyinstaller.readthedocs.io/en/stable/spec-files.html

pyinstaller打包django项目的实现步骤

 不修改.spec文件,直接运行以下语句


pyinstaller manage.spec

我们可以发现能够打包成功,但是在manage.exe所在路径下,在cmd中运行manage.exe runserver,会发现以下错误:

ImportError: No module named admin

这种错误的原因是 django.contrib.admin在django项目中是隐式导入的,所以pyinstaller打包时,并不能识别这种库或者模块,导致打包出来的.exe中并不包括这样隐式导入的库。

如果碰到这样的错误,只需要将这个库添加到.spec文件中的hiddenimports中即可。在接下来打包django项目缺少很多这样的隐式库,所以我.spec文件中一并修改了,修改如下:(如果缺少什么,直接在hiddenimports中加就可以了)

pyinstaller打包django项目的实现步骤

注:这里有个坑,特别需要关注

如果打包好的.exe运行后,报错ImportError: No module named apps,当你在hiddenimports中加入了'django.contrib.admin.apps',结果还是报同样的错误。这是因为添加的apps模块不完整,要在hiddenimports中加入以下全部的apps模块:(这些apps在django项目中的settings.py文件中可以全部找到,照着添加就可以了,另处还有context_processors模块,middleware模块也需要注意)


'django.contrib.admin.apps','django.contrib.auth.apps','django.contrib.contenttypes.apps',
'django.contrib.sessions.apps', 'django.contrib.messages.apps', 'django.contrib.staticfiles.apps',

以上hiddenimports弄好后,运行后会出现以下的错误
TemplateDoesNotExist  这个是因为没有找到templates文件.

pyinstaller打包django项目的实现步骤

可以根据错误提示将templates文件添加至对应的路径下,刷新即可。其中front是我工程下一个放所有前端东西的文件,templates是用来放html的一个文件夹。(所以具体的添加要根据错误提示是在哪里找不到就添加至哪里)

在第五步后,可以发现页面已经出来,但是发现页面没有css和js了
这是因为Pyinstaller 能找到templates(html files文件),但不能找到css和js文件。

我的具体操作是在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')],

考虑到第5步,再这里我也直接将templates文件打包到了对应的文件。所以第五步就不用自己再复制templates文件到指定的文件夹了。

最后.spec文件看起来如下:

pyinstaller打包django项目的实现步骤

一切准备好后,执行下面语句就OK


pyinstaller manage.spec

如果在项目中有多进程,可以参考以下
https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Multiprocessinghttps://stackoverflow.com/questions/24944558/pyinstaller-built-windows-exe-fails-with-multiprocessing

来源:https://blog.csdn.net/qq_34809033/article/details/81873896

标签:pyinstaller,打包,django
0
投稿

猜你喜欢

  • PHP simplexml_load_file()函数讲解

    2023-06-03 23:16:56
  • PHP平滑关闭/重启的实现方法

    2023-10-05 08:48:29
  • Oracle收购TimesTen 提高数据库软件性能

    2010-07-21 13:03:00
  • asp如何计算下载一个文件需要多长时间?

    2009-11-25 20:17:00
  • PHP实现的DES加密解密类定义与用法示例

    2023-07-17 08:55:54
  • Postman 使用指南及小技巧

    2023-06-23 22:28:38
  • Javascript的匿名函数

    2008-05-07 13:33:00
  • 作为Web开发人员,我为什么喜欢Google Chrome浏览器

    2011-08-29 15:37:47
  • Python入门教程 超详细1小时学会Python

    2023-06-13 23:34:12
  • HTTP 错误 500.100 - 内部服务器错误 - ASP 错误

    2008-09-12 13:07:00
  • 三种不同方式连接MySQL数据库的方法及示例

    2010-06-11 13:37:00
  • django表单实现下拉框的示例讲解

    2022-03-24 09:18:25
  • ORACLE常见错误代码的分析与解决(一)

    2010-08-02 13:20:00
  • PHP中__LINE__,__FILE__,__DIR__等常用魔术常量实例讲解

    2023-06-13 23:42:32
  • 考虑SQL Server安全时所应注意的几个方面

    2009-01-04 13:57:00
  • go日志库中的logrus

    2023-07-21 13:48:02
  • 制作全局临时表

    2010-06-11 13:36:00
  • js页面文字选中后分享到新浪微博实现

    2011-03-17 12:55:00
  • 如何判断发言是否为空?

    2010-01-12 20:15:00
  • PHP的PDO大对象(LOBs)

    2023-06-07 06:45:36
  • asp之家 网络编程 m.aspxhome.com