在Ubuntu上运行Google的Python App Engine时出现ImportError

2 投票
6 回答
1096 浏览
提问于 2025-04-15 15:50

我正在自学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 个回答

0

这个错误的意思是,Python找不到或者无法读取它想要导入的名字。因为导入os_compat是AppEngine的dev_appserver.py文件中第一个可以执行的代码行,所以我怀疑你的路径设置可能有问题。

3

这个问题的原因是,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

1

这是一个文件权限的问题。os_compat.py这个文件用户是无法读取的,只有root用户可以。我不确定是我搞错了,还是默认的权限设置没有让所有人都能读取,但这就是解决办法。

我不太想接受自己的回答,因为Kyle给了一个很好的回应,但现在我不需要$PYTHONPATH的修复了,因为我已经执行了 sudo chown -R +r /opt/google_appengine/google_appengine_1.2.7

撰写回答