使mod_wsgi使用python2.7.2而不是python2.6?

我正在运行Ubuntu 10.04.1 LTS,它预先装好了python2.6,但是我需要用python2.7.2来replace它。

(原因很简单,2.7有很多function从3反向移植)

我已经安装了python2.7.2使用

./configure make make altinstall 

altinstall选项将它安装到/usr/local/lib/python2.7,而不用接触系统默认版本,并将解释器放在/usr/local/bin/python2.7

然后,以帮助mod_wsgifindpython2.7我添加到/ etc / apache2 / sites-available / wsgisite

 WSGIPythonHome /usr/local 

我启动apache并运行一个testingwsgi应用程序,但我是由Python 2.6.5而不是Python2.7迎接

后来我将默认的python simlinkreplace为python 2.7

 ln -f /usr/local/bin/python2.7 /usr/bin/python 

现在在控制台上键入“python”打开python2.7,但不知何故mod_wsgi仍然拿起python2.6

接下来我尝试了,

 PATH=/usr/local/bin:$PATH export PATH 

然后做一个快速重启apache,但又是它的python2.6!


这是我的$ PATH

 /usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 

/ etc / apache2 / sites-available / wsgisite的内容

 WSGIPythonHome /usr/local <VirtualHost *:80> ServerName wsgitest.local DocumentRoot /home/wwwhost/pydocs/wsgi <Directory /home/wwwhost/pydocs/wsgi> Order allow,deny Allow from all </Directory> WSGIScriptAlias / /home/wwwhost/pydocs/wsgi/app.wsgi </VirtualHost> 

app.wsgi

 import sys def application(environ, start_response): status = '200 OK' output = sys.version response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output] 

Apache error.log

 'import site' failed; use -v for traceback [Sun Jun 19 00:27:21 2011] [info] mod_wsgi (pid=23235): Initializing Python. [Sun Jun 19 00:27:21 2011] [notice] Apache/2.2.14 (Ubuntu) mod_wsgi/2.8 Python/2.6.5 configured -- resuming normal operations [Sun Jun 19 00:27:21 2011] [info] Server built: Nov 18 2010 21:20:56 [Sun Jun 19 00:27:21 2011] [info] mod_wsgi (pid=23238): Attach interpreter ''. [Sun Jun 19 00:27:21 2011] [info] mod_wsgi (pid=23239): Attach interpreter ''. [Sun Jun 19 00:27:31 2011] [info] mod_wsgi (pid=23238): Create interpreter 'wsgitest.local|'. [Sun Jun 19 00:27:31 2011] [info] [client 192.168.1.205] mod_wsgi (pid=23238, process='', application='wsgitest.local|'): Loading WSGI script '/home/wwwhost/pydocs/$ [Sun Jun 19 00:27:50 2011] [info] mod_wsgi (pid=23239): Create interpreter 'wsgitest.local|'. 

有没有人设法使mod_wsgi在非系统默认版本的python上运行?

编译python 2.7

 ./configure \ --prefix=/usr/local \ --enable-unicode=ucs4 \ --enable-shared \ LDFLAGS="-Wl,-rpath /usr/local/lib" make && make altinstall 

不要忘记--enable-shared启用--enable-shared否则你以后可能会遇到问题。

编译python 2.7的mod_wsgi

https://code.google.com/p/modwsgi/wiki/InstallationIssues

既然你做了make altinstall来安装python2.7你将不需要安装python-devel软件包; 所以你需要mod_wsgi来引用适当的python。

 ./configure --with-python=/usr/local/bin/python2.7 # then edit Makefile if you want to change DESTDIR make && make install 

尝试启动httpd …

启动httpd:httpd:/etc/httpd/conf/httpd.conf第221行的语法错误:/etc/httpd/conf.d/wsgi.conf第2行的语法错误:无法加载/opt/mod_wsgi2.7/ usr / lib64 / httpd / modules / mod_wsgi.so到服务器:libpython2.7.so.1.0:无法打开共享目标文件:没有这样的文件或目录

因为我们没有使用相同的python,而且我们也没有将模块与任何特定的选项链接起来,使它看起来在正确的位置,它找不到libpython2.7.so.1.0 ,我们可以通过使libtool检查正确地方 。

 # use LDFLAGS to tell libtool resulting lib needs to # look for shared libs in /usr/local/lib too. ./configure \ --with-python=/usr/local/bin/python2.7 \ LDFLAGS="-R/usr/local/lib" # then edit Makefile if you want to change DESTDIR # eg DESTDIR = /opt/mod_wsgi2.7 make && make install 

尝试再次启动http

启动httpd:httpd:/etc/httpd/conf/httpd.conf第221行的语法错误:/etc/httpd/conf.d/wsgi.conf第2行的语法错误:无法加载/opt/mod_wsgi2.7/ usr / lib64 / httpd / modules / mod_wsgi.so放入服务器:/opt/mod_wsgi2.7/usr/lib64/httpd/modules/mod_wsgi.so:无法打开共享对象文件:Permission denied

最后一个错误是因为我的系统正在运行selinux并且文件有默认的上下文。 快速浏览一下stackoverflow告诉我这是一个selinux问题。

修复selinux上下文

 # ls -Z /opt/mod_wsgi2.7/usr/lib64/httpd/modules/mod_wsgi.so -rwxr-xr-x. root root unconfined_u:object_r:user_tmp_t:s0 /opt/mod_wsgi2.7/usr/lib64/httpd/modules/mod_wsgi.so 

解决方法是使用正确的上下文,它可以在原始的mod_wsgi模块中find。

 chcon --reference /etc/httpd/modules/mod_wsgi.so /opt/mod_wsgi2.7/usr/lib64/httpd/modules/mod_wsgi.so 

你也需要重新编译mod_wsgi too 。 只是重新编译python是不够的(不要忘记加载正确版本的mod_wsgi

编辑: 点击这里安装说明

这是你如何configurationmod_wsgi来使用Python2.7

我遇到了同样的问题。 我正在看卸载mod_wsgi的选项,并用适当的configuration重新安装它。

阅读其中一篇文章,我意识到没有必要卸载我目前的mod_wsgi,我可以继续前进,重新安装mod_wsgi3.4(早先我有v3.2)的设置使用Python2.7(看起来像安装过程重新写入所有内容,没有任何错误/冲突)。

因为我已经安装了Python2.7。

我重新安装了mod_wsgi-3.4(不执行任何卸载)

[root @ server〜]#cd〜

[root @ server〜]#wget http://modwsgi.googlecode.com/files/mod_wsgi-3.4.tar.gz

[root @ server〜]#tar xvf mod_wsgi-3.4.tar.gz

[root @ server〜]#cd mod_wsgi-3.4

使用已安装的python2.7configurationmod_wsgi

[root @ server〜]#。/ configure –with-python = / usr / local / bin / python2.7

[root @ server〜]#make

[root @ server〜]#make install

以下两个命令非常重要。 如果/ usr / local / lib不在/ usr / local / lib中,则将其replace为安装了libpython2.7.so.1.0的文件夹。

[root @ server〜]#LD_LIBRARY_PATH = / usr / local / lib / usr / local / bin / python

[root @ server〜]#ldconfig

重新启动Apache服务器

[root @ server〜]#service httpd restart

[root @ server〜]#ldd /etc/httpd/modules/mod_wsgi.so

上述命令的输出:Line2表示你的mod_wsgi现在正在使用Python2.7库。 好极了!

  linux-vdso.so.1 => (0x00007fffc0aa9000) libpython2.7.so.1.0 => /usr/lib/libpython2.7.so.1.0 (0x00007f03a5b20000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f03a5903000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f03a56fe000) libutil.so.1 => /lib64/libutil.so.1 (0x00007f03a54fb000) libm.so.6 => /lib64/libm.so.6 (0x00007f03a5277000) libc.so.6 => /lib64/libc.so.6 (0x00007f03a4ee2000) /lib64/ld-linux-x86-64.so.2 (0x00007f03a6133000) 

在Amazon Linux 4.9.38-16.35.amzn1.x86_64上安装ReviewBoard工具时,遇到同样的问题:http: 4.9.38-16.35.amzn1.x86_64

通过运行yum install mod_wsgi ,我得到了mod_wsgi-python26.x86_64 。 后来我学会了用yum yum search mod_wsgi来searchyum,发现python27安装也可用。 所以运行sudo yum install mod_wsgi-python27.x86_64解决了这个问题。