You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用cx_Freeze打包Django项目为.exe时遇AttributeError错误求助

Django项目cx_Freeze打包exe报错AttributeError的解决办法

问题场景

尝试用cx_Freeze将Django项目打包为.exe文件,执行python freeze_script.py build时触发错误,提示AttributeError: 'NoneType' object has no attribute 'write'。

用户的freeze_script.py代码:

# freeze_script.py

import os
import sys
from cx_Freeze import setup, Executable
from django.core.management import call_command
from django.core.wsgi import get_wsgi_application

# 手动配置Django设置
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DVE.settings')  # 将'your_project_name.settings'替换为实际的设置模块
application = get_wsgi_application()
# 你的Django项目名称(将'your_project_name'替换为实际项目名称)
project_name = 'DVE'

base = None

if sys.platform == "win32":
    base = "Win32GUI"

executables = [
    Executable("manage.py", base=base)
]

# 打包前调用'migrate'命令
call_command("migrate")

# 冻结应用程序
build_options = {
    'packages': ['DVE','TOOL', 'django', 'gunicorn'],
    'includes': ['django.template.backends', 'django.templatetags.i18n'],
}


setup(
    name="TOOL",
    version="1.0",
    description="TOOL",
    options={"build_exe": build_options},
    executables=executables
)

错误信息

Traceback (most recent call last):

"C:\Users\AAMOLGHA\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\cx_Freeze\initscripts\__startup__.py", line 124, in run

File module_init.run(name + "__main__")

File "C:\Users\AAMOLGHA\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\cx_Freeze\initscripts\console.py", line 16, in run

exec(code, module_main.__dict__) File "manage.py", line 22, in <module>

File "manage.py", line 18, in main

File "C:\Users\AAMOLGHA\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\django\core\management\__init__.py", line 442, in execute_from_command_line utility.execute()

File "C:\Users\AAMOLGHA\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\django\core\management\__init__.py", line 424, in execute

sys.stdout.write(self.main_help_text() + "\n")

AttributeError: 'NoneType' object has no attribute 'write'

问题原因

base="Win32GUI"是cx_Freeze为无控制台的GUI程序设计的模式,启用后会将sys.stdout和sys.stderr设为None。但你打包的manage.py是Django控制台工具,启动后需要向标准输出打印内容,因此触发了NoneType的属性错误。

解决方案

方案1:移除Win32GUI base设置(推荐)

既然打包的是控制台工具,不需要GUI模式,直接修改freeze_script.py中的base配置:

base = None

# 注释或删除Win32GUI的判断代码
# if sys.platform == "win32":
#     base = "Win32GUI"

或者显式指定控制台模式:

if sys.platform == "win32":
    base = "Console"  # 默认也是控制台模式,显式指定更清晰
else:
    base = None

方案2:若需GUI模式,重定向stdout/stderr

如果项目是GUI程序,需保留Win32GUI模式,可在程序初始化时将标准输出/错误重定向到日志文件,避免NoneType错误。在freeze_script.py或manage.py开头添加:

import sys
import os

# 重定向stdout和stderr到日志文件
if sys.stdout is None:
    log_path = os.path.join(os.path.dirname(sys.executable), "stdout.log")
    sys.stdout = open(log_path, "w", encoding="utf-8")
if sys.stderr is None:
    err_log_path = os.path.join(os.path.dirname(sys.executable), "stderr.log")
    sys.stderr = open(err_log_path, "w", encoding="utf-8")

内容的提问来源于stack exchange,提问作者Avantika Ghanta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:52:04