我正在开发一个使用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
答案 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