Python3环境下非GAE项目执行Django/pip操作出现Google App Engine报错
解决Python3环境下GAE distutils导致的SyntaxError问题
这个问题我之前也碰到过!根源是Google Cloud SDK里附带的Google App Engine(GAE)旧版distutils模块是基于Python2开发的,而你的Python3环境的PYTHONPATH优先加载了这个旧模块,导致出现SyntaxError: invalid syntax——因为Python3不支持raise DistutilsOptionError, \这种Python2风格的语法。
下面是几种可行的解决办法:
临时快速解决(单次生效)
直接在运行pip命令时指定优先加载标准库的distutils路径,比如:
PYTHONPATH=/usr/lib/python3.5/distutils pip3 freeze
注意:如果你的Python3版本不是3.5,或者标准distutils路径不同,可以先用这个命令确认正确路径:
python3 -c "import distutils; print(distutils.__file__)"把输出的路径(去掉
/__init__.py部分)替换到上面的命令里即可。
永久修复(全局生效)
调整环境变量,让标准Python3的distutils路径始终排在GAE路径前面:
- 打开你的shell配置文件(比如
~/.bashrc、~/.zshrc,取决于你用的终端) - 添加以下内容(替换路径为你刚才确认的标准distutils路径):
# 修复GAE distutils干扰Python3的问题 export PYTHONPATH="/usr/lib/python3.5/distutils:$PYTHONPATH"
- 保存文件后,运行
source ~/.bashrc(对应你的配置文件)让修改立即生效。
隔离环境(推荐长期方案)
使用Python虚拟环境(venv),虚拟环境的依赖是独立的,不会受到系统中GAE模块的干扰:
# 创建虚拟环境 python3 -m venv my_project_env # 激活虚拟环境 source my_project_env/bin/activate # 现在在这个环境里运行pip3 freeze、安装模块都不会有问题了
当你不需要虚拟环境时,运行deactivate即可退出。
极端方案(如果不需要GAE)
如果你完全不用Google App Engine,可以直接卸载Google Cloud SDK里的GAE组件,或者卸载整个SDK,彻底消除干扰。
内容的提问来源于stack exchange,提问作者APorter1031
相关产品推荐
相关产品推荐

