我的问题是关注错误:
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
答案 0 :(得分:1)
__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'))