我正在尝试使用Google的AppEngine自学python,我无法让dev服务器运行。我收到这个错误:
追踪(最近的呼叫最后):
提交“/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行,在run_file中 execfile(script_path,globals_)文件 “/opt/google_appengine/google_appengine_1.2.7/google/appengine/tools/dev_appserver_main.py” 第65行,在 来自google.appengine.tools导入os_compat ImportError:无法导入 名称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,我想我已经解决了这个问题。
凯尔建议我需要设置我的PYTHONPATH变量。运行后
export PYTHONPATH=/opt/google_appengine/google_appengine_1.2.7
尝试运行dev_appserver.py时仍然遇到同样的错误。我设置PYTHONPATH错了吗?或者,如何卸载协议缓冲区python项目?我对Ubuntu One没用,而且已经卸载了它。
答案 0 :(得分:3)
问题似乎是Karmic Koala 9.10(最新版本的Ubuntu)附带Ubuntu One,这是一个依赖于Google protocol buffers库的python应用程序。 python-protobuf包在/usr/lib/pymodules/python2.6中提供了google.protobuf包。
不幸的是,AppEngine SDK包含另一个名为google.appengine的软件包。因此,在您的代码中的某个地方,正在导入Google软件包,并且首先在PYTHONPATH上找到包含protobuf的软件包。 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 project的错误。
更新:我已提交了bug against the AppEngine API。
答案 1 :(得分:1)
这是文件权限问题。用户无法读取os_compat.py,只能由root读取。我不确定我是否搞砸了这个,或者如果默认情况下权限没有全部读取,那就是修复。
在Kyle做出如此好的回应之后,我讨厌接受我自己的回答,但我现在不需要$ PYTHONPATH修复就能使它工作sudo chown -R +r /opt/google_appengine/google_appengine_1.2.7
答案 2 :(得分:0)
有了这个错误,Python就说它无法找到或读取它试图导入的名称。由于导入os_compat
是AppEngine dev_appserver.py
的第一个可执行行,我怀疑路径配置方式存在问题。
答案 3 :(得分:0)
最新版本的Ubuntu(10.10)也删除了Python 2.5 - 使安装App Engine开发环境变得很麻烦。
我(最终)让我的环境正常工作(包括使用App Engine Helper进行单元测试)。我构建了这个可能对其他人有用的bash脚本。它安装:
答案 4 :(得分:0)
Ubuntu 11.04附带python 2.6作为默认版本。建议使用版本为2.5的Google应用引擎。我使用它多年来使用python 2.6没有任何问题。
为了使用python 2.6顺利执行它,您需要做的是编辑google/appengine/tools/dev_appserver.py
并添加这三行
'_counter',
'_fastmath',
'strxor',
在'XOR',
之后'_Crypto_Cipher__AES',
之前~1350行。
答案 5 :(得分:0)
如果您现在正在使用Google Cloud SDK,请将其放入~/.profile
。
export CLOUDSDK_ROOT_DIR="/path/to/google/cloud/sdk/"
export APPENGINE_HOME="${CLOUDSDK_ROOT_DIR}/platform/appengine-java-sdk"
export GAE_SDK_ROOT="${CLOUDSDK_ROOT_DIR}/platform/google_appengine"
# The next line enables Java libraries for Google Cloud SDK
export CLASSPATH="${APPENGINE_HOME}/lib":${CLASSPATH}
# The next line enables Python libraries for Google Cloud SDK
export PYTHONPATH=${GAE_SDK_ROOT}:${PYTHONPATH}
# * OPTIONAL STEP *
# If you wish to import all Python modules, you may iterate in the directory
# tree and import each module.
#
# * WARNING *
# Some modules have two or more versions available (Ex. django), so the loop
# will import always its latest version.
for module in ${GAE_SDK_ROOT}/lib/*; do
if [ -r ${module} ]; then
PYTHONPATH=${module}:${PYTHONPATH}
fi
done
unset module
不要放在~/.bashrc
内,因为每次打开bash会话时,所有这些模块都会一次又一次地添加到您的PYTHONPATH
环境变量中。