2013-12-11 19 views
0

我的問題是以下錯誤:如何使用Python組織庫+谷歌應用程序引擎+ oauthlib

ImportError: No module named oauthlib.oauth2 

所以,因爲它似乎我不能在GAE開發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我有下面的代碼來拿起「庫」文件夾:

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包,所以有初始化的.py 它打破庫的代碼內進口,即文件oauthlib /的oauth2/rfc6749 /客戶/ 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

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')) 
+0

注意到main。Py(我擴展系統路徑)位於lib文件夾相同的水平,所以我不尋找lib文件夾內的應用程序文件夾,至於你的第一個建議,我更新了我的問題 – endryha