我正在 Ubuntu 12.04.3 LTS EC2 实例上设置一个 flask 应用程序,一切似乎都运行良好(即我可以通过公开可用的 url 访问网页),直到我尝试导入一个模块(例如 numpy)并意识到 apache python 与我用来编译 mod_wsgi 的那个以及我正在使用的那个不同
我正在运行 apache2。
apache2 日志显示警告(特别是最后一行显示路径没有改变):
[warn] mod_wsgi: Compiled for Python/2.7.5.
[warn] mod_wsgi: Runtime using Python/2.7.3.
[warn] mod_wsgi: Python module path '/usr/lib/python2.7/:/usr/lib/python2.7/plat-linux2:/usr/lib/python2.7/lib-tk:/usr/lib$
我试图在我的虚拟主机conf中设置路径(我的python与所有其他库一起位于/home/ubuntu/anaconda/bin中):
WSGIPythonHome /home/ubuntu/anaconda
WSGIPythonPath /home/ubuntu/anaconda
<VirtualHost *:80>
ServerName xx-xx-xxx-xxx-xxx.compute-1.amazonaws.com
ServerAdmin [email protected]
WSGIScriptAlias / /var/www/microblog/microblog.wsgi
<Directory /var/www/microblog/app/>
Order allow,deny
Allow from all
</Directory>
Alias /static /var/www/microblog/app/static
<Directory /var/www/FlaskApp/FlaskApp/static/>
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
但是我仍然收到警告,并且 apache python 路径没有改变 - 我需要在哪里放置相关指令以将 apache 指向我的 python 版本和模块(例如 scipy、numpy 等)?
另外,我可以使用虚拟环境来避免这种情况吗?
提前致谢。
编辑#1:
我跑了:
>>> import sys
>>> print sys.prefix
要得到:
/home/ubuntu/anaconda
并使用 set/unset LD_LIBRARY_PATH 运行 ldd mod_wsgi.so 会产生相同的符号链接
libpython2.7.so.1.0 => /usr/lib/libpython2.7.so.1.0 (0x00007f13ca1c1000)
这是python的系统版本,不是我想要的版本,也不是我运行时编译mod_wsgi的版本:
./configure --with-python=/home/ubuntu/anaconda/bin/python2.7
答案1
补丁级别修订的差异通常无关紧要,解释如下:
更重要的是,当脚本在mod_wsgi下运行时,sys.prefix的值是什么。
mod_wsgi.so 文件实际上正在使用哪个 Python 共享库,以及您是否正确编译了它以确保它将选择备用共享库。
如果它确实没有选择正确的共享库,那么不匹配可能是一个问题,您需要重新编译 mod_wsgi。
阅读文档并按照其中说明对您的安装进行检查,然后根据需要采取其中描述的操作。