【问题标题】:How to organize libs with Python + Google App Engine + oauthlib如何使用 Python + Google App Engine + oauthlib 组织库
【发布时间】:2013-12-11 00:28:23
【问题描述】:

我的问题是以下错误:

ImportError: No module named oauthlib.oauth2

看来我无法在 gae dev environemnt 中导入 oauthlib

我有以下项目结构

app_root/
    app/          - source files of the app
    libs/         - third party libraries
      gdata/      - google data library
      atom/       - requires by google data
      oauthlib/   - [oauthlib][1]
    test/         - unit tests
app.yaml          - gae config
main.py           - main script

这里是app.yaml的来源

application: app
version: v1

runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: .*
  script: main.app

libraries:
- name: webapp2
  version: "2.5.2"

在 main.py 中,我有以下代码可以在“libs”文件夹中获取:

sys.path.append(os.path.join(os.path.dirname(__file__), 'libs'))

最后我的模块中有以下导入:

from oauthlib.oauth2 import RequestValidator, WebApplicationServer

结果当我从pycharm 启动应用程序时,我收到此错误:

    from oauthlib.oauth2 import RequestValidator, WebApplicationServer
ImportError: No module named oauthlib.oauth2

我真的不明白为什么会这样,在我的 IDE 中它没有将导入突出显示为红色,所以它可以看到引用是好的。

我对 python 有点陌生,所有这些使用第三方库的方法真的让我很困惑。实际上有很多关于这个的问题,比如有没有更好的方法来管理 gae 的第三方库。

但让我们专注于主要问题。为什么引用应该没问题时会抛出 ImportError?

更新 #1 如果我将库作为 python 包,那么 init.py 它破坏了库代码中的导入,即文件 oauthlib/oauth2/rfc6749/clients/base.py 包含:

from oauthlib.oauth2.rfc6749 import tokens
from oauthlib.oauth2.rfc6749.parameters import prepare_token_request
from oauthlib.oauth2.rfc6749.errors import TokenExpiredError
from oauthlib.oauth2.rfc6749.errors import InsecureTransportError
from oauthlib.oauth2.rfc6749.utils import is_secure_transport

但当前模块路径包含 libs.prefix

【问题讨论】:

    标签: python google-app-engine


    【解决方案1】:

    IIRC,您应该可以通过将简单的__init__.py 放置在路径中的正确位置来做到这一点:

    app_root/
        app/          - source files of the app
        libs/         - third party libraries
          __init__.py - # Add this
          gdata/      - google data library
          atom/       - requires by google data
          oauthlib/   - [oauthlib][1]
        test/         - unit tests
    app.yaml          - gae config
    main.py           - main script
    

    现在,您可以执行以下操作,而不是与sys.path 混淆:

    from libs.oauthlib.oauth2 import RequestValidator, WebApplicationServer
    

    如果你真的想继续使用你的系统路径,那么我认为你需要另一个os.path.dirname,因为你的.py文件似乎在app。实际上,您似乎在与 python 源文件相同的目录中寻找lib。:

    app_dir = os.path.dirname(__file__)
    root_dir = os.path.dirname(app_dir)
    sys.path.append(os.path.join(root_dir, 'libs'))
    

    【讨论】:

    • 请注意 main.py(我在其中扩展系统路径)与 lib 文件夹位于同一级别,因此我不会在 app 文件夹中查找 lib 文件夹,至于您更新的第一个建议我的问题
    猜你喜欢
    • 2012-04-03
    • 2020-01-23
    • 2011-06-05
    • 2018-04-15
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    相关资源
    最近更新 更多