Django4.0用PyInstaller5.1打包后运行runserver报脚本不存在错误
报错原因
这个错误由两个核心问题触发:
- Django开发服务器默认的自动重载机制与PyInstaller打包环境不兼容:Django的autoreload模块启动时会查找磁盘上的原始入口脚本
manage.py,但打包后该脚本已被编译嵌入exe内部,不存在实体.py文件,模块会误将传入的runserver参数识别为待执行的脚本路径,直接抛出文件不存在的错误。 - 现有.spec配置缺失必要的打包规则:没有收集Django内置资源、项目模块、静态文件、数据库文件,就算绕过重载报错,后续也会出现模块导入失败、资源404等问题。
修复步骤
- 禁用打包环境下的Django自动重载
两种实现方式选其一即可:- 临时方案:启动exe时追加
--noreload参数,命令如下:.\manage.exe runserver --noreload - 永久方案:修改
manage.py代码,检测到打包环境时自动追加禁用重载的参数,无需每次启动手动输入。修改后的main函数代码:def main(): """Run administrative tasks.""" os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'muviny.settings') # 检测PyInstaller打包环境,强制关闭自动重载 if getattr(sys, 'frozen', False): sys.argv.append('--noreload') try: from django.core.management import execute_from_command_line except ImportError as exc: raise ImportError( "Couldn't import Django. Are you sure it's installed and " "available on your PYTHONPATH environment variable? Did you " "forget to activate a virtual environment?" ) from exc execute_from_command_line(sys.argv)
- 临时方案:启动exe时追加
- 补全.spec文件的打包配置
打开你现有的manage.spec文件,按如下规则修改:- 在文件最顶部导入PyInstaller内置的Django资源收集工具:
import os from PyInstaller.utils.hooks import collect_django_dependencies, collect_static_files, collect_submodules - 替换原
Analysis段的pathex、datas、hiddenimports配置,补全资源和模块收集规则:a = Analysis( ['manage.py'], pathex=[os.path.abspath('.')], binaries=[], datas=collect_static_files() + [ ('muviny', 'muviny'), # 替换为你自己的项目配置目录名 ('webapp', 'webapp'), # 你自行开发的app目录 ('db.sqlite3', '.') # SQLite数据库文件,用其他数据库可以删掉这行 ], hiddenimports=collect_django_dependencies() + collect_submodules('webapp') + collect_submodules('muviny'), hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, )
- 在文件最顶部导入PyInstaller内置的Django资源收集工具:
- 重新打包并验证
执行命令基于修改后的spec文件重新打包:
打包完成后进入pyinstaller manage.specdist/manage目录,直接执行.\manage.exe runserver即可正常启动服务。
补充说明
runserver是Django自带的开发服务器,仅适合本地调试使用,生产环境建议替换为waitress、gunicorn等生产级WSGI服务器- 后续新增app、静态资源、模板文件时,需要同步在spec文件的
datas和hiddenimports配置中添加对应目录的收集规则 - 如果启动后出现静态资源404、模板不存在的报错,优先检查对应目录是否被正确加入
datas配置
内容的提问来源于stack exchange,提问作者Walulya francis
相关产品推荐
相关产品推荐

