如何使用Python + Google App Engine + oauthlib组织库

时间:2013-12-11 00:28:23

标签: python google-app-engine

我的问题是关注错误:

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的新手,所有这些与第三方库的方法确实让我感到困惑。事实上,有很多问题,比如有更好的方法来管理第三方库。

但是让我们关注主要问题。为什么在引用应该没问题时抛出ImportError?

更新#1 如果我将libs作为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

1 个答案:

答案 0 :(得分: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'))