升级Python 3后Google App Engine dev_appserver报错‘python2: command not found’
为啥明明用了Python3.7,dev_appserver还找Python2?
早期版本的Google Cloud SDK里,dev_appserver.py本身是基于Python2开发的——哪怕你的app.yaml已经指定了Python3.7作为运行时,只要SDK没更新到支持Python3的版本,它还是会默认调用Python2来启动自己。加上你用的Mac OS X 10.11.6是比较老的系统,默认安装的SDK版本大概率没跟上新的Python兼容要求。
一步步解决问题
1. 先更新Google Cloud SDK到最新版
先看看你当前的SDK版本:
gcloud version
如果版本比较旧,直接执行更新:
gcloud components update
新版本的SDK已经把dev_appserver.py改成支持Python3运行了,更新后应该会自动用你系统里的Python3环境启动。
2. 直接用Python3启动dev_appserver.py
要是更新SDK遇到问题(比如旧系统不兼容新版本),可以绕开默认调用,直接指定Python3来运行脚本:
# 先找到dev_appserver.py的路径 which dev_appserver.py # 然后用python3运行它 python3 /你找到的路径/dev_appserver.py app.yaml --enable_console
3. 配置环境变量强制SDK用Python3
设置CLOUDSDK_PYTHON环境变量,告诉Google Cloud SDK默认用Python3:
export CLOUDSDK_PYTHON=python3
如果想让这个设置永久生效,把上面这行加到你的~/.bash_profile或者~/.zshrc里(看你平时用的是bash还是zsh),保存后重启终端就行。
4. 修正你的app.yaml配置
你的配置里有个小坑:Python3运行时不需要script字段,而且你已经通过entrypoint指定了gunicorn的启动命令,handlers里的script: main.app会冲突。修改后的配置应该是这样:
application: bones version: 1 runtime: python37 entrypoint: gunicorn -b :$PORT main:app api_version: 1 threadsafe: true handlers: - url: /static static_dir: static - url: /.* secure: always redirect_http_response_code: 301
(注:Python3环境下的handlers规则和Python2不一样,script字段已经不再适用,全靠entrypoint来指定启动逻辑)
额外提醒
Mac OS X 10.11.6对新版本SDK的兼容性可能有限,如果更新SDK时出错,可以试试找适配旧系统的SDK版本,或者用Python虚拟环境把Python3环境隔离开,避免和系统自带的Python2搞混。
内容的提问来源于stack exchange,提问作者zerowords

