uWSGI - ImportError:没有名为google.oauth2.credentials的模块

时间:2018-03-29 23:13:06

标签: python-2.7 uwsgi

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

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

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

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

我感到困惑的是隐式命名空间打包在python2.7中是如何工作的。通过pip的安装过程是否做了一些特别的事情?

我还对通过uwsgi运行python2.7时的不同感到困惑。

相关版本

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

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的提示:https://stackoverflow.com/a/15209116/177646

1 个答案:

答案 0 :(得分:0)

原来问题是我的uWSGI配置错误。由于我没有使用virtualenv,我需要将PYTHONHOME设置为正确的值,在我的情况下为/usr/local。在uwsgi配置中,可以通过home参数指定。一旦设置好,那么python似乎正常工作。

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

这也解释了为什么我必须始终在/usr/local/lib/python2.7/site-packages中导入PYTHONPATH。设置PYTHONHOME后,我就不再需要将网站包添加到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