【问题标题】:ImportError running Google's python appengine on UbuntuImportError 在 Ubuntu 上运行 Google 的 python 应用程序引擎
【发布时间】:2009-11-10 05:34:48
【问题描述】:

我正在尝试使用 Google 的 AppEngine 自学 Python,但我无法让开发服务器运行。我收到此错误:

回溯(最近一次通话最后一次):
文件“/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 导入 o​​s_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,我想我已经解决了。

Kyle 建议我需要设置我的 PYTHONPATH 变量。运行后

export PYTHONPATH=/opt/google_appengine/google_appengine_1.2.7

我在尝试运行 dev_appserver.py 时仍然遇到同样的错误。我设置 PYTHONPATH 错误吗?或者,如何卸载协议缓冲区 python 项目?我没用过 Ubuntu One,已经卸载了。

【问题讨论】:

    标签: python linux google-app-engine


    【解决方案1】:

    问题似乎在于 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。

    【讨论】:

    • 我仍然收到相同的错误消息。编辑了这个问题。
    【解决方案2】:

    这是一个文件权限问题。 os_compat.py 不能被用户读取,只能被 root 读取。我不确定我是否搞砸了,或者默认情况下权限是否没有全读,但这就是修复。

    在 Kyle 给出如此好的回应后,我讨厌接受我自己的回答,但我不需要 $PYTHONPATH 修复程序来让它工作,因为我做了sudo chown -R +r /opt/google_appengine/google_appengine_1.2.7

    【讨论】:

      【解决方案3】:

      由于该错误,Python 表示它无法找到或读取它尝试导入的名称。由于os_compat 的导入是AppEngine 的dev_appserver.py 的第一个可执行行,我怀疑您的路径配置方式存在问题。

      【讨论】:

        【解决方案4】:

        最新版本的 Ubuntu (10.10) 还删除了 Python 2.5 - 安装 App Engine 开发环境变得很痛苦。

        我(终于)让我的环境正常工作(包括使用 App Engine Helper 进行单元测试)。我构建了这个可能对其他人有用的 bash 脚本。它安装:

        1. sqlite
        2. libsqlite
        3. pep8
        4. 模拟
        5. OpenSSL
        6. Python 2.5.2
        7. Python SSL 库
        8. Django 1.1(生产中的最新版本)
        9. App 引擎
        10. App 引擎助手

        http://pageforest.googlecode.com/hg/tools/pfsetup

        【讨论】:

          【解决方案5】:

          Ubuntu 11.04 附带 python 2.6 作为默认版本。建议使用 2.5 版本的谷歌应用引擎。我在 python 2.6 上使用了很多年,没有任何问题。

          为了在 python 2.6 中顺利执行,你需要编辑 google/appengine/tools/dev_appserver.py 并添加这三行

            '_counter',
            '_fastmath',
            'strxor',
          

          在'XOR', 之后和'_Crypto_Cipher__AES', 之前约1350 行。

          【讨论】:

            【解决方案6】:

            如果您现在使用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 环境变量中。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-07-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多