Snow Leopard上mod_wsgi的Python版本不匹配

1 投票
3 回答
2146 浏览
提问于 2025-04-15 17:15

我正在尝试在 Mac OS X 10.6 上使用非默认的 Python 安装来运行 mod_wsgi 3.1 和 Apache 2.2.14。

下载了 mod_wsgi 的源代码后,我运行了:

sudo apachectl -k stop

然后

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

我又重新启动了 Apache

sudo apachectl -k start

当我查看 /var/log/httpd/error_log 时,我看到:

[2009年12月21日 12:27:26] [警告] mod_wsgi: 为 Python/2.6.4 编译。

[2009年12月21日 12:27:26] [警告] mod_wsgi: 运行时使用 Python/2.6.1。

[2009年12月21日 12:27:26] [通知] Apache/2.2.14 (Unix) DAV/2 mod_wsgi/3.1 Python/2.6.1 已配置 -- 恢复正常操作

当我运行 otool -L mod_wsgi.so 时,我看到:

mod_wsgi.so:

/System/Library/Frameworks/Python.framework/Versions/2.6/Python (兼容版本 2.6.0,当前版本 2.6.1)

/usr/lib/libSystem.B.dylib (兼容版本 1.0.0,当前版本 125.0.0)

这是怎么回事?为什么它会链接到系统框架?

这是我运行 mod_wsgi 配置和构建命令的输出:


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

检查 apxs2... 没有

检查 apxs... /opt/apache2/bin/apxs

检查 Apache 版本... 2.2.14

配置: 创建 ./config.status

config.status: 创建 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

在文件 /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: 警告: 'PyArg_ParseTuple' 是一个未识别的格式函数类型

/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

密码:

/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

3 个回答

0

因为某些原因,有些从源代码安装的Python框架,通常是通过MacPorts安装的,里面嵌入的信息可能有问题,导致运行时查找可执行文件的路径设置不正确。结果,它最终使用的是来自/System/Library的Python框架。

当你为mod_wsgi运行'configure'时,可以加上一个额外的选项'--disable-framework'。比如:

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

这样做会改变Python库/框架的链接方式,可能会解决这个问题。

想了解更多细节,可以查看以下链接中的bug修复(1)和(2):

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

2

这篇帖子虽然有点旧,但在搜索关于mac + homebrew + python的时候还是会出现,所以我想补充一些有用的信息。我遇到的问题和原作者一样,只是用的是不同的模块(uwsgi)。我了解到其实你不需要放弃homebrew。实际上,homebrew可以把python安装成一个框架;你只需要告诉它这样做就可以了:

% brew uninstall python
Uninstalling /usr/local/Cellar/python/2.7.2...
% brew install python --universal --framework

... 一切就都好了。

0

Graham在mod_wsgi的邮件列表上帮我解决了这个问题。

http://groups.google.com/group/modwsgi/browse_thread/thread/4046eaf290a49b1e/ae14888450de39f5#ae14888450de39f5

下面是总结:

问题出在我通过Homebrew安装的python。Homebrew的python并没有作为一个框架或动态库安装,所以不能用于嵌入(比如在Apache/mod_wsgi中使用)。

于是我从源代码安装了python 2.6.4:

./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

我成功构建了一个可以用来编译mod_wsgi的python 2.6.4版本:

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

为了确认:

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

/opt/apache2/modules/mod_wsgi.so: /usr/lib/libSystem.B.dylib (兼容版本 1.0.0, 当前版本 125.0.0) /usr/local/python-2.6.4/frameworks/Python.framework/Versions/2.6/Python (兼容版本 2.6.0, 当前版本 2.6.0)

这表明python现在使用的是2.6.4框架,而不是系统自带的版本。当我启动apache时,不再出现版本不匹配的警告。

我重新安装了django、psycopg2等到我的新python安装中,一切都运行得很好。再次感谢你的帮助!

撰写回答