pyinstaller打包django项目

本文详细介绍了如何使用PyInstaller将Django项目打包成exe文件,包括解决隐式导入模块缺失、模板文件未找到及静态资源(css/js)丢失等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

​​​​​

  1. 安装pyinstaller
    pip install pyinstaller
  2. 制作项目的.spec文件
      进入django项目所在路径,运行
    pyi-makespec -D manage.py
       在路径下,生成一个.spec文件
  3. 以文本的方式打开.spec文件,spec文件格式如下。具体spec的使用,可以查看官网
    Using Spec Files — PyInstaller 4.7 documentation

     
  4. 不修改.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中加就可以了)

    注:这里有个坑,特别需要关注
    如果打包好的.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',

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

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

  6. 在第五步后,可以发现页面已经出来,但是发现页面没有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')],

    考虑到第5步,再这里我也直接将templates文件打包到了对应的文件。所以第五步就不用自己再复制templates文件到指定的文件夹了。
    最后.spec文件看起来如下:

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

    pyinstaller manage.spec
  7. 如果在项目中有多进程,可以参考以下
    https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Multiprocessingpython - PyInstaller-built Windows EXE fails with multiprocessing - Stack Overflow

### 使用 PyInstaller 打包 Django 项目的教程 #### 准备工作 为了成功打包 Django 项目,确保开发环境中已经安装了必要的工具和库。这包括 Python 解释器以及用于创建独立可执行文件的 PyInstaller。 #### 制作 `.spec` 文件 进入 Django 项目所在的路径,通过命令行运行 `pyi-makespec -D manage.py` 来生成配置文件[^1]。此操作将会基于当前项目的结构自动生成一个适合于该应用的 spec 配置模板,其中 `-D` 参数指定了要构建的是一个目录形式而非单一文件格式的应用程序。 ```bash cd path_to_your_django_project pyi-makespec -D manage.py ``` #### 修改 `.spec` 文件 根据实际需求调整刚刚生成的 `.spec` 文件中的设置项,比如指定额外的数据文件、图标或者其他资源。对于 Django 应用来说,可能还需要特别注意静态文件和服务端媒体文件的位置处理方式。 #### 构建可执行文件 完成上述准备工作之后,可以利用 PyInstaller 命令来编译整个工程: ```bash pyinstaller yourprojectname.spec ``` 这里假设 `yourprojectname.spec` 是之前创建好的规格定义文件名。执行这条指令后,PyInstaller 就会按照设定去解析所有的依赖关系并将它们连同主脚本一起被打包进最终产物里。 #### 注意事项 当使用 PyInstallerDjango 工程进行封装时需要注意几个方面: - **数据库连接**:由于目标平台上的环境变量可能会有所不同,在部署前应仔细检查并适当修改数据库配置部分。 - **静态文件管理**:考虑到生产环境下通常会有专门的服务负责提供这些资产(如 Nginx),因此建议在打包过程中排除不必要的静态内容以减小程序体积。 - **第三方扩展支持**:某些插件或中间件可能无法直接被识别出来作为隐含导入而需手动添加至 spec 中。 - **多线程或多进程模式下的兼容性测试**:确保所使用的并发模型能够在脱离源码的情况下正常运作[^4]。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值