Apache2/WSGI/Flask应用出现sqlalchemy模块缺失ImportError求助
解决Apache WSGI无法导入sqlalchemy的问题
这个问题我之前也碰到过,核心原因很明确:你命令行使用的Python环境,和Apache的WSGI进程依赖的Python环境不是同一个。虽然你在命令行能正常导入sqlalchemy,但WSGI运行的那个Python解释器根本找不到这个模块。下面给你几个靠谱的解决办法:
方法1:给WSGI对应的Python环境安装sqlalchemy
首先得搞清楚WSGI到底用的是哪个Python版本:
- 打开你的
/var/www/FlaskApps/FlaskApps.wsgi,在开头加两行测试代码:import sys print(sys.executable) - 重启Apache:
sudo service apache2 restart - 查看
/var/log/apache2/error.log,里面会输出WSGI使用的Python绝对路径,比如/usr/bin/python3.8或者/usr/bin/python2.7
找到路径后,用这个路径直接安装sqlalchemy:
# 假设WSGI用的是Python3.8,替换成你查到的实际路径 sudo /usr/bin/python3.8 -m pip install sqlalchemy
安装完成后,把刚才加的测试代码删掉,再重启Apache试试。
方法2:在WSGI文件中手动添加模块路径
如果你已经知道sqlalchemy安装在哪个目录,可以直接把这个目录加到WSGI的模块搜索路径里:
先在命令行查sqlalchemy的安装父目录:
python -c "import sqlalchemy; print(sqlalchemy.__path__)"会得到类似
['/usr/local/lib/python3.8/dist-packages/sqlalchemy']的结果,取前面的父目录/usr/local/lib/python3.8/dist-packages打开
FlaskApps.wsgi,在导入project之前添加这条路径:import sys import logging logging.basicConfig(stream=sys.stderr) # 添加模块安装路径 sys.path.insert(0, "/usr/local/lib/python3.8/dist-packages") sys.path.insert(0,"/var/www/FlaskApps/FirstApp/") from project import app as application
方法3:修改Apache配置指定WSGI的Python环境
如果你的系统装了多个Python版本,也可以直接在Apache的站点配置里指定WSGI用的Python:
打开你的/etc/apache2/sites-available/FirstApp.conf,在<VirtualHost>块里面添加一行:
# 替换成你查到的WSGI Python路径 WSGIPythonHome /usr/bin/python3.8 # 或者直接指定模块搜索路径 WSGIPythonPath /usr/local/lib/python3.8/dist-packages
保存后重启Apache:sudo service apache2 restart
一般来说方法1是最稳妥的,直接给WSGI用的环境装模块,不会有路径冲突的问题。
内容的提问来源于stack exchange,提问作者CorneeldH
相关产品推荐
相关产品推荐

