views:

414

answers:

2

Hello,

I'm trying to run mod_wsgi 3.1 under Apache 2.2.14 using a non-default python installation on Mac OS X 10.6.

After downloading the mod_wsgi source I run:

sudo apachectl -k stop

then

./configure --with-python=/usr/local/Cellar/python/2.6.4/bin/python
make
sudo make install

I then start up apache again

sudo apachectl -k start

When I cat /var/log/httpd/error_log I see:

[Mon Dec 21 12:27:26 2009] [warn] mod_wsgi: Compiled for Python/2.6.4.

[Mon Dec 21 12:27:26 2009] [warn] mod_wsgi: Runtime using Python/2.6.1.

[Mon Dec 21 12:27:26 2009] [notice] Apache/2.2.14 (Unix) DAV/2 mod_wsgi/3.1 Python/2.6.1 configured -- resuming normal operations

When I run otool -L mod_wsgi.so is see:

mod_wsgi.so:

/System/Library/Frameworks/Python.framework/Versions/2.6/Python (compatibility version 2.6.0, current version 2.6.1)

/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.0)

What gives? Why is it linking with the system framework?

Here is the output from my mod_wsgi configure and build commands:


Archimedes:mod_wsgi-3.1 awolf$ ./configure --with-python=/usr/local/Cellar/python/2.6.4/bin/python

checking for apxs2... no

checking for apxs... /opt/apache2/bin/apxs

checking Apache version... 2.2.14

configure: creating ./config.status

config.status: creating Makefile

Archimedes:mod_wsgi-3.1 awolf$ make

/opt/apache2/bin/apxs -c -I/usr/local/Cellar/python/2.6.4/include/python2.6 -DNDEBUG -Wc,'-arch x86_64' mod_wsgi.c -L/usr/local/Cellar/python/2.6.4/lib -L/usr/local/Cellar/python/2.6.4/lib/python2.6/config -arch x86_64 -lpython2.6 -ldl /Library/Webserver/build/libtool --silent --mode=compile gcc -prefer-pic -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -no-cpp-precomp -g -O2 -I/opt/apache2/include -I/opt/apache2/include -I/opt/apache2/include -arch x86_64 -I/usr/local/Cellar/python/2.6.4/include/python2.6 -DNDEBUG -c -o mod_wsgi.lo mod_wsgi.c && touch mod_wsgi.slo

In file included from /usr/local/Cellar/python/2.6.4/include/python2.6/Python.h:125,

             from mod_wsgi.c:135:

/usr/local/Cellar/python/2.6.4/include/python2.6/modsupport.h:27: warning: 'PyArg_ParseTuple' is an unrecognized format function type /Library/Webserver/build/libtool --silent --mode=link gcc -o mod_wsgi.la -rpath /opt/apache2/modules -module -avoid-version mod_wsgi.lo -L/usr/local/Cellar/python/2.6.4/lib -L/usr/local/Cellar/python/2.6.4/lib/python2.6/config -arch x86_64 -lpython2.6 -ldl

Archimedes:mod_wsgi-3.1 awolf$ sudo make install

Password:

/opt/apache2/bin/apxs -i -S LIBEXECDIR=/opt/apache2/modules -n 'mod_wsgi' mod_wsgi.la

/Library/Webserver/build/instdso.sh SH_LIBTOOL='/Library/Webserver/build/libtool' mod_wsgi.la /opt/apache2/modules

/Library/Webserver/build/libtool --mode=install cp mod_wsgi.la /opt/apache2/modules/

cp .libs/mod_wsgi.so /opt/apache2/modules/mod_wsgi.so

cp .libs/mod_wsgi.lai /opt/apache2/modules/mod_wsgi.la

cp .libs/mod_wsgi.a /opt/apache2/modules/mod_wsgi.a

chmod 644 /opt/apache2/modules/mod_wsgi.a

ranlib /opt/apache2/modules/mod_wsgi.a

A: 

Because for some reason some Python framework installs from source code, usually MacPorts, have something wrong with the information embedded in the Python framework and the run time look up path of the executable isn't set correctly. As a result it ends up using the Python framework from /System/Library instead.

When you run 'configure' for mod_wsgi add the additional option '--disable-framework'. Eg:

./configure --with-python=/usr/local/Cellar/python/2.6.4/bin/python --disable-framework

This will change how Python library/framework is linked and may resolve the problem.

For more details see bug fixes (1) and (2) in:

http://code.google.com/p/modwsgi/wiki/ChangesInVersion0206

Graham Dumpleton
Thanks for the reply. Unfortunately the --disable-framework has no effect. (I first did: rm /opt/apache2/modules/mod_wsgi.so; rm -rf ~/Downloads/mod_wsgi3.1/build; make distclean). I'll check out your link now and see if there are any gems in there.
awolf
By the way, I used Homebrew to install python into /var/local/Cellar...
awolf
Then take the issue over to the mod_wsgi mailing list so can double confirm you are actually doing what was asked and that it had the result which was expected. It is too hard to support complex issues here and the mailing list should be used for that instead.
Graham Dumpleton
A: 

Graham helped me solve this over on the mod_wsgi mailing list.

http://groups.google.com/group/modwsgi/browse%5Fthread/thread/4046eaf290a49b1e/ae14888450de39f5#ae14888450de39f5

Here's a summary:

The problem was my installation of python was done via Homebrew. Homebrew’s python is not installed as a framework OR dylib install so it could not be used for embedding (such as in Apache/mod_wsgi).

Instead I installed python 2.6.4 from source:

./configure --prefix=/usr/local/python-2.6.4 --enable-framework=/usr/local/python-2.6.4/frameworks --enable-universalsdk=/ MACOSX_DEPLOYMENT_TARGET=10.5 --with-universal-archs=3-way
make
sudo make install

I was able to build a version of python 2.6.4 that I could then build mod_wsgi with:

./configure --with-python=/usr/local/python-2.6.4/bin/python
make
sudo make install

To confirm:

otool -L /opt/apache2/modules/ mod_wsgi.so

/opt/apache2/modules/mod_wsgi.so: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.0) /usr/local/python-2.6.4/frameworks/Python.framework/Versions/2.6/Python (compatibility version 2.6.0, current version 2.6.0)

shows that python is now using the 2.6.4 framework and not the system one. When I start apache, I no longer get the version mismatch warnings.

I re-installed django, psycopg2, and so on into my new python installation and everything is working like a charm. Thanks again for your help!

awolf