我在雪豹上需要32位libxml2支持Python吗?
我在我的MacBook Pro上安装Scrapy时遇到了很多麻烦。它需要libxml2这个库,所以我开始安装它。从MacPorts安装似乎没有下载到Python的绑定。
按照Scrapy的说明从源代码安装(这里)确实安装了Python的绑定,但当我运行'python -c "import libxml2"'时,出现了架构不匹配的错误:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "libxml2.py", line 1, in <module>
import libxml2mod
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site- packages/libxml2mod.so, 2): no suitable image found. Did find:
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site- packages/libxml2mod.so: mach-o, but wrong architecture
当我明确构建libxml2的DLL为32位时,那个错误消失了,但libxslt却因为某个其他库不是32位而无法构建。我有点害怕继续往下搞。所以问题是——Python是只能用32位的吗?我是不是做了什么傻事?
编辑 - 这是Python 2.6
编辑 2 - 应大家要求,我把@Ned Deily的精彩回答整理到这里。所有的功劳归他,我只是根据他的回答发布我采取的步骤:
如果你一直在折腾MacPorts(而且没有通过它安装其他需要的东西),那就把它们删了。
$ sudo rm -r /opt/local
在/opt/local/etc/macports/variants.conf
中添加以下内容,以防止在接下来的命令中下载整个Unix库。
+bash_completion +quartz +ssl +no_x11 +no_neon +no_tkinter +universal +libyaml -scientific
安装MacPorts版本的Python。
$ sudo port install python26
安装Scrapy的前置依赖。
sudo port install py26-libxml2 py26-twisted py26-openssl py26-simplejson py26-setuptools python_select
sudo python_select python26
测试是否选择了正确的Python:运行$ which python
,应该显示类似'/opt/local/bin/python'的内容,而这个链接应该指向/opt/local/bin/python2.6。
测试是否有正确的架构:运行file 'which python'
(单引号应该是反引号,应该输出(对于运行10.6的Intel Mac):
/opt/local/bin/python2.6: Mach-O universal binary with 2 architectures
/opt/local/bin/python2.6 (for architecture x86_64): Mach-O 64-bit executable x86_64
/opt/local/bin/python2.6 (for architecture i386): Mach-O executable i386
测试libxml是否成功安装。
$ python -c 'import libxml2'
如果一切正常,你应该不会看到任何输出。
安装Scrapy。
sudo /opt/local/bin/easy_install-2.6 scrapy
穿上衣服在街上欢呼,庆祝一切都完成了。再次感谢Ned提供的详细回答。
4 个回答
感谢 @Ned Deily 的贡献
如果你想在 OS X 10.6 上运行 Scrapy 0.8,按照这些步骤应该能成功。这里使用的是 Macports 安装的 Python 2.6,而不是系统自带的版本。以下步骤假设你还没有安装 Macports。
首先,从这里获取最新的 MacPorts 安装程序并进行安装:
http://www.macports.org/install.php
sudo port install py26-libxml2 py26-twisted py26-openssl py26-simplejson py26-setuptools python_select
sudo /opt/local/bin/easy_install-2.6 scrapy
然后,把你的 ~.profile 文件修改成:
export PATH=/opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:$PATH
我想分享一点小经验。在跟着这篇帖子学习的时候,我开始时安装了三个版本的Python:
- 默认的苹果Python 2.5.1,位置在:/usr/bin/python
- 一个版本在:/Library/Frameworks/Python.framework/Versions/2.7
- 还有一个Macport版本在:/opt/local/bin/python2.6
我遇到的问题是:
$ python
每次都默认使用2.7版本,而我其实想用Macports版本。尝试以下方法也没有解决问题:
$ sudo python_select python26
我甚至删除了2.7版本,但结果只导致了一个错误。
后来我发现需要更改默认路径,指向Macports版本,方法如下:
$ PATH=$PATH\:/opt/local/bin ; export PATH
然后重新启动端口等设置。
最后,我无法通过这些指令默认引用scrapy-ctl.py文件,所以我只能直接引用这个文件:
/opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin/scrapy-ctl.py
更新
在这篇帖子中补充一些快速的说明,关于如何创建链接,具体内容可以在Scrapy网站找到(#2和#3)。
从#2开始,“将Scrapy添加到你的Python路径”:
sudo ln -s /opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin/scrapy-ctl.py /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/scrapy
然后是#3,“让scrapy命令可用”:
sudo ln -s /opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin/scrapy-ctl.py /usr/local/bin/scrapy
从你的错误信息来看,你安装的是 python.org 的 python 2.6.4 版本(安装在 /Library/Frameworks/Python.frameworks
...)。这个版本只能在 32 位系统上运行。而在 10.6 版本的系统上,MacPorts 默认会安装 64 位的包。你可以通过在 MacPorts 的安装命令中加上 +universal
这个选项,或者把它添加到 /opt/local/etc/macports/variants.conf
文件中,来改变这一点。不过,如果你需要用到很多不同的包,建议你直接用 MacPorts 安装一个完整的 64 位 python2.6 版本,这样会简单很多。除了 scrapy 之外,你应该能找到几乎所有需要的包。你需要修改你的 $PATH,把 /opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin
和 /opt/local/bin
放在其他 Python 目录之前。像这样应该可以(未测试!):
sudo port selfupdate # ensure you have the latest ports file information
sudo port install py26-libxml2 py26-twisted py26-openssl py26-simplejson py26-setuptools python_select
sudo python_select python26 # optionally make /opt/local/bin/python -> python2.6
sudo /opt/local/bin/easy_install-2.6 scrapy
# or install manually
cd /path/to/scrapy
sudo /opt/local/bin/python2.6 setup.py install
编辑:在 10.6 上,由于 64 位模式下缺少 Tk 支持,Tk 默认使用的是 X11 版本,这个你可能不想要也不需要。我在 /opt/local/etc/macports/variants.conf
中添加了以下选项(并不是所有选项都适用于 python 及其相关包):
+bash_completion +quartz +ssl +no_x11 +no_neon +no_tkinter +universal +libyaml -scientific
编辑:如果 MacPorts 安装得当,你在 10.6 上应该能看到类似这样的信息:
$ ls -l /opt/local/bin/python2.6
lrwxr-xr-x 1 root wheel 73 Oct 28 20:25 /opt/local/bin/python2.6@ -> /opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin/python2.6
$ file /opt/local/bin/python2.6
/opt/local/bin/python2.6: Mach-O universal binary with 2 architectures
/opt/local/bin/python2.6 (for architecture x86_64): Mach-O 64-bit executable x86_64
/opt/local/bin/python2.6 (for architecture i386): Mach-O executable i386
这是在你添加了 +universal
选项的情况下,否则你可能只会看到单一的 x86_64 或 i386 架构。
使用相对路径时,确保你的 shell 的 $PATH 中,MacPorts 的两个目录在最前面:
$ echo $PATH
/opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin:/opt/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin ...
你可能需要编辑你的 ~/.bash_profile
或其他 shell 文件,以使这个更改“永久生效”。如果你希望直接用 python
命令来调用 MacPorts 的 Python,确保运行上面提到的 python_select
命令。如果你仍然遇到问题,MacPorts 的一个好处是你可以很容易地删除并重新开始;只需:
$ sudo rm -r /opt/local
然后下载 MacPorts 10.6 的安装程序。不过其实你不需要这样做。我觉得最好还是把这个问题解决掉,这样将来会省去很多麻烦。