我在雪豹上需要32位libxml2支持Python吗?

3 投票
4 回答
3208 浏览
提问于 2025-04-15 19:51

我在我的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 个回答

0

感谢 @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
1

我想分享一点小经验。在跟着这篇帖子学习的时候,我开始时安装了三个版本的Python:

  1. 默认的苹果Python 2.5.1,位置在:/usr/bin/python
  2. 一个版本在:/Library/Frameworks/Python.framework/Versions/2.7
  3. 还有一个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
5

从你的错误信息来看,你安装的是 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 的安装程序。不过其实你不需要这样做。我觉得最好还是把这个问题解决掉,这样将来会省去很多麻烦。

撰写回答