在Ubuntu上运行Google的python appengine的ImportError

时间:2009-11-10 05:34:48

标签: python linux google-app-engine

我正在尝试使用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没用,而且已经卸载了它。

6 个答案:

答案 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脚本。它安装:

  1. 源码
  2. libsqlite
  3. PEP8
  4. 模拟
  5. OpenSSL的
  6. Python 2.5.2
  7. Python SSL库
  8. Django 1.1(最新版本)
  9. App Engine
  10. App Engine Helper
  11. http://pageforest.googlecode.com/hg/tools/pfsetup

答案 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环境变量中。