Python3虚拟环境启动Django项目时遇SyntaxError报错求助
) from exc的SyntaxError问题 这个问题我之前也碰到过,核心原因其实是你执行manage.py的时候,实际调用的不是虚拟环境里的Python3.6,而是系统里的低版本Python(大概率是Python2)。
为什么会报错?
raise ImportError(...) from exc这种带from的异常链语法是Python 3.3及以上版本才支持的特性,Python 2.x完全不认识这个语法,所以当用Python2执行这个脚本时,就会直接抛出SyntaxError: invalid syntax。
而你在命令行里直接运行python能正常导入Django,是因为此时调用的是虚拟环境里的Python3.6——但直接运行./manage.py时,Windows系统会根据文件关联规则,调用默认的Python解释器(如果你的系统里装了Python2,它可能被设为默认),这就导致了矛盾的现象。
解决方法
1. 显式用虚拟环境的Python运行manage.py
激活虚拟环境后,不要直接用./manage.py,而是显式指定python命令来运行脚本:
python manage.py
虚拟环境激活后,系统PATH会优先指向虚拟环境的Scripts目录,所以这里的python就是你虚拟环境里的3.6版本,能正确识别异常链语法。
2. 确认当前环境的Python版本
激活虚拟环境后,先运行以下命令确认版本:
python --version
输出必须是Python 3.6.3,如果不是,说明虚拟环境激活不生效——可以尝试关闭当前终端,重新打开后再执行env/scripts/activate激活虚拟环境。
3. 极端情况:直接指定虚拟环境Python的完整路径
如果上面的方法还是不行,可以直接用虚拟环境Python的绝对路径来运行:
../env/Scripts/python.exe manage.py
这样能100%确保用的是虚拟环境里的Python解释器。
额外验证
你可以在manage.py的最顶部加一行代码,打印当前Python解释器的路径和版本,帮助排查:
import sys print(sys.executable, sys.version)
然后分别运行./manage.py和python manage.py,对比输出的路径和版本,就能清楚看到差异了。
内容的提问来源于stack exchange,提问作者dWitty

