uWSGI - ImportError: No module named google.oauth2.credentials

uWSGI - ImportError: No module named google.oauth2.credentials

我正在开发一个 运行 使用 uwsgi 的 Flask 应用程序。我 运行 遇到以下错误 ImportError: No module named google.oauth2.credentials

当我 运行 Flask 应用程序使用 Flask 的内置开发服务器时,应用程序 运行 没有问题。

问题似乎源于 google-auth 模块的安装方式。 site-packagesgoogle 命名空间文件夹中没有 __init__.py 文件。完整路径为 /usr/local/lib/python2.7/site-packages/google.

我知道 python3.3 通过 PEP-420 隐式命名空间打包。

我感到困惑的是隐式名称空间打包在 python2.7 中的工作方式。通过 pip 的安装过程是否有特殊之处?

我也很困惑 运行ning python2.7 通过 uwsgi 时有什么不同。


相关版本


我还包括了以下准系统测试以重现错误。

test.ini

[uwsgi]
socket = 0.0.0.0:5001
plugins-dir = /usr/lib/uwsgi/
plugins = python
protocol = uwsgi
pythonpath = /usr/local/lib/python2.7/site-packages
callable = app
max-requests = 1000
master = True
lazy-apps = True
processes = 1

test.py

import google.oauth2.credentials

工作命令

python test.py

命令失败

uwsgi --ini test.ini --wsgi-file test.py

失败结果

当我运行上面的命令时,程序会由于以下ImportError而失败。

Traceback (most recent call last):
  File "test.py", line 1, in <module>
    import google.oauth2.credentials
ImportError: No module named google.oauth2.credentials

当前解决方法

我目前的解决方法是手动添加一个包含以下内容的 __init__.py 文件(这基本上是在 google-auth 存储库中找到的内容,但由于某种原因在安装时被删除通过 pip):

try:
    import pkg_resources
    pkg_resources.declare_namespace(__name__)
except ImportError:
    import pkgutil
    __path__ = pkgutil.extend_path(__path__, __name__)

解决方法 2

另一种让导入正常工作的方法是这样做:

import site
site.addsitedir('/usr/local/lib/python2.7/site-packages')

import google.oauth2.credentials

这似乎暗示 uwsgi 没有完全初始化 python 至少在初始启动时是这样。

我从这个答案得到了尝试 site.addistedir 的提示:

原来问题是我的 uWSGI 配置错误。因为我没有使用 virtualenv,所以我需要将 PYTHONHOME 设置为正确的值,在我的例子中是 /usr/local。在 uwsgi 配置中,这可以通过 home 参数指定。设置完成后,python 似乎可以正常工作。

一旦 PYTHONHOME 设置正确,就可以找到 google_auth-1.4.1-py3.6-nspkg.pth 文件。

这也解释了为什么我必须总是在我的 PYTHONPATH 中导入 /usr/local/lib/python2.7/site-packages。设置 PYTHONHOME 后,我不再需要将 site-packages 添加到我的 PYTHONPATH.

示例:

[uwsgi]
socket = 0.0.0.0:5001
plugins-dir = /usr/lib/uwsgi/
plugins = python
protocol = uwsgi
home = /usr/local
callable = app
max-requests = 1000
master = True
lazy-apps = True
processes = 1