在Ubuntu上运行Google的Python App Engine时出现ImportError
我正在自学Python,使用的是谷歌的AppEngine,但是我无法启动开发服务器。出现了这个错误:
追踪记录(最近的调用在最后):
文件 "/opt/google_appengine/google_appengine_1.2.7/dev_appserver.py",第60行,
run_file(file, globals()) 文件 "/opt/google_appengine/google_appengine_1.2.7/dev_appserver.py",第57行,
execfile(script_path, globals_) 文件 "/opt/google_appengine/google_appengine_1.2.7/google/appengine/tools/dev_appserver_main.py",第65行,
from google.appengine.tools import os_compat 导入错误:无法导入 名称 os_compat
我使用的是Ubuntu 9.10,自带python2.6(不行),我又安装了python2.5(也不行),尝试用python dev_appserver.py helloWorld
运行(不行),还尝试在编辑第一行后运行dev_appserver.py,改成:
#!/usr/bin/env python2.5
我在网上找不到关于这个错误的任何信息。我找到的唯一问题是关于使用python 2.5的,我想我已经解决了。
Kyle建议我需要设置PYTHONPATH变量。在运行了
export PYTHONPATH=/opt/google_appengine/google_appengine_1.2.7
之后,我尝试运行dev_appserver.py时仍然出现同样的错误。我是不是设置PYTHONPATH的方式不对?另外,我该如何卸载协议缓冲区的Python项目?我对Ubuntu One没有用处,已经卸载了。
6 个回答
这个错误的意思是,Python找不到或者无法读取它想要导入的名字。因为导入os_compat
是AppEngine的dev_appserver.py
文件中第一个可以执行的代码行,所以我怀疑你的路径设置可能有问题。
这个问题的原因是,Karmic Koala 9.10(最新的Ubuntu版本)自带了一个叫做Ubuntu One的应用,它是用Python写的,并且依赖于谷歌的协议缓冲区库。python-protobuf这个包在/usr/lib/pymodules/python2.6目录下提供了google.protobuf这个包。
不幸的是,AppEngine SDK里面还有一个叫做google.appengine的包。所以在你的代码中的某个地方,google这个包被导入了,而包含protobuf的包在PYTHONPATH中被优先找到。Python会缓存它在sys.modules中找到的第一个包,所以SDK中的第二个google包就不会被导入了。
你可以把google AppEngine SDK放到PYTHONPATH的最前面。这样可以确保Python找到的是google.appengine包,而不是python-protobuf提供的那个包。
PYTHONPATH=/opt/google_appengine/google_appengine_1.2.7 \
python dev_appserver.py helloWorld
这是一个应该向AppEngine SDK项目报告的bug。
更新:我已经提交了一个关于AppEngine API的bug。
这是一个文件权限的问题。os_compat.py这个文件用户是无法读取的,只有root用户可以。我不确定是我搞错了,还是默认的权限设置没有让所有人都能读取,但这就是解决办法。
我不太想接受自己的回答,因为Kyle给了一个很好的回应,但现在我不需要$PYTHONPATH的修复了,因为我已经执行了 sudo chown -R +r /opt/google_appengine/google_appengine_1.2.7
。