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-packages
的 google
命名空间文件夹中没有 __init__.py
文件。完整路径为 /usr/local/lib/python2.7/site-packages/google
.
我知道 python3.3 通过 PEP-420 隐式命名空间打包。
我感到困惑的是隐式名称空间打包在 python2.7 中的工作方式。通过 pip
的安装过程是否有特殊之处?
我也很困惑 运行ning python2.7 通过 uwsgi 时有什么不同。
相关版本
- python 2.7.14
- 点 9.0.3
- uwsg 2.0.13
- google-auth 1.4.1
- 通过 pip 安装(不使用 virtualenv)
- https://github.com/GoogleCloudPlatform/google-auth-library-python
我还包括了以下准系统测试以重现错误。
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
我正在开发一个 运行 使用 uwsgi 的 Flask 应用程序。我 运行 遇到以下错误 ImportError: No module named google.oauth2.credentials
。
当我 运行 Flask 应用程序使用 Flask 的内置开发服务器时,应用程序 运行 没有问题。
问题似乎源于 google-auth
模块的安装方式。 site-packages
的 google
命名空间文件夹中没有 __init__.py
文件。完整路径为 /usr/local/lib/python2.7/site-packages/google
.
我知道 python3.3 通过 PEP-420 隐式命名空间打包。
我感到困惑的是隐式名称空间打包在 python2.7 中的工作方式。通过 pip
的安装过程是否有特殊之处?
我也很困惑 运行ning python2.7 通过 uwsgi 时有什么不同。
相关版本
- python 2.7.14
- 点 9.0.3
- uwsg 2.0.13
- google-auth 1.4.1
- 通过 pip 安装(不使用 virtualenv)
- https://github.com/GoogleCloudPlatform/google-auth-library-python
我还包括了以下准系统测试以重现错误。
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