mod_wsgi on Snow Leopard python 版本不匹配

Posted

技术标签:

【中文标题】mod_wsgi on Snow Leopard python 版本不匹配【英文标题】:mod_wsgi on Snow Leopard python version mismatch 【发布时间】:2010-12-28 21:16:04 【问题描述】:

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

下载 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

当我 cat /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 配置和构建命令的输出:


阿基米德: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

阿基米德: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/包括 -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

阿基米德: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

【问题讨论】:

【参考方案1】:

这篇文章很旧,但仍然出现在有关 mac + homebrew + python 的搜索中,所以我想我会添加一些有用的信息。作为OP,我遇到了问题,只是使用了不同的模块(uwsgi)。我了解到您不必放弃自制软件。 Homebrew 实际上可以将 python 安装为框架;你只需要告诉它这样做:

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

...一切都很好。

【讨论】:

【参考方案2】:

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

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

总结如下:

问题是我的 python 安装是通过 Homebrew 完成的。 Homebrew 的 python 没有作为框架安装或 dylib 安装,因此不能用于嵌入(例如在 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

我能够构建一个 python 2.6.4 版本,然后我可以构建它 mod_wsgi 与:

./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 安装中,一切都像魅力一样工作。 再次感谢你的帮助!

【讨论】:

【参考方案3】:

由于某些原因,某些 Python 框架从源代码安装,通常是 MacPorts,嵌入在 Python 框架中的信息有问题,并且可执行文件的运行时查找路径设置不正确。因此,它最终改用了 /System/Library 中的 Python 框架。

当您为 mod_wsgi 运行“配置”时,添加附加选项“--disable-framework”。例如:

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

这将改变 Python 库/框架的链接方式,并可能解决问题。

有关更多详细信息,请参阅以下错误修复 (1) 和 (2):

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

【讨论】:

感谢您的回复。不幸的是 --disable-framework 没有效果。 (我首先做了:rm /opt/apache2/modules/mod_wsgi.so; rm -rf ~/Downloads/mod_wsgi3.1/build; make distclean)。我现在去看看你的链接,看看里面有没有宝石。 然后将问题转移到 mod_wsgi 邮件列表,这样可以再次确认您实际上正在执行所要求的操作并且它具有预期的结果。在这里支持复杂的问题太难了,应该使用邮件列表来代替。

以上是关于mod_wsgi on Snow Leopard python 版本不匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Leopard 和 Snow Leopard 支持添加到 Lion Cocoa 应用程序?

如何为Snow Leopard编译XJig?

Snow Leopard 中的 Finder 插件

Snow Leopard Automator:尝试创建用于转换 Excel 文件的工作流程

Snow Leopard 上的 dylib “文件不是必需的架构”

用于Snow Leopard上的mercurial的GUI