我需要在Snow Leopard上为Python安装32位的libxml2吗?

3
我在我的 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 dlls为32位时,该错误消失了,但是libxslt无法构建,因为某个其他库不是32位。我害怕继续拉这个线。所以问题是 - Python只有32位吗?我在这里做了什么愚蠢的事情吗?
编辑 - 这是Python 2.6
编辑2 - 根据大家的要求,我正在整合@Ned Deily的精彩答案。所有功劳都归于他,我只是根据他的回答发布了我的步骤:
如果你一直在搞mac端口(并且没有安装任何其他必需的东西),就把它们清除掉。
$ 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的英特尔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提供详细的回答。


你的libxml2mod路径中有一些空格,这只是一个复制粘贴错误吗?(因为在两个不同的地方它并不明显) - mmmmmm
复制粘贴错误。终端 -> 所以4个空格用于代码缩进 == 空格混乱。 - kolosy
4个回答

5
从您的回溯路径来看,似乎您已经安装并正在尝试使用python.org python 2.6.4(安装在/Library/Frameworks/Python.frameworks...)。该python仅支持32位。默认情况下,在10.6上,MacPorts会尝试安装64位版本的软件包。您可以通过在MacPorts安装命令中指定+universal变量或将其添加到/opt/local/etc/macports/variants.conf中来更改大多数MacPorts软件包。但是,由于您需要各种软件包,如果您只需要这个软件包用于自己的机器,您可能会发现使用MacPorts安装完整的python2.6 64位解决方案要容易得多。除了scrapy本身,您应该会发现几乎所有所需软件包已经存在。您需要修改$ PATH以在其他任何包含Python的目录之前添加/opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin/opt/local/bin。像这样的东西应该可以工作(未经测试!):
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版本,这可能既不是您想要的也不是您需要的。 对于10.6,我在/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安装程序。但实际上你不应该这样做。我认为最好解决并使其正常工作,因为这很可能会在未来节省大量麻烦。


虽然我不得不说,port install 正在拖垮整个系统 5。呃。X11 和 Python 有什么关系?!@。唉! - kolosy
经过仔细检查,从mp下载的python26是32位的。它与我已经拥有的10/27/09版本相同,并且不是32位的,除非我做错了什么。 - kolosy
谢谢,但是端口的某些地方让我感到困惑,因为它告诉我已经安装了: $ file which python /Library/Frameworks/Python.framework/Versions/2.6/bin/python: Mach-O通用二进制文件,具有2种体系结构 /Library/Frameworks/Python.framework/Versions/2.6/bin/python(针对PPC体系结构): Mach-O可执行文件PPC /Library/Frameworks/Python.framework/Versions/2.6/bin/python(针对i386体系结构): Mach-O可执行文件i386 - kolosy
1
检查您的shell $PATHwhich python的输出,以确定您正在调用哪个Python版本。在OS X上安装多个不同版本的Python是很常见的,因此很容易混淆。使用绝对路径可以帮助解决这个问题:MacPorts使用/opt/local/bin/python2.6,python.org使用/usr/local/bin/python2.6,10.6中由Apple提供的Python使用/usr/bin/python2.6 - Ned Deily
为了让事情“不那么”混乱,/opt/local/bin/python2.6 是指向 /Frameworks/... 的链接,这是 i386+ppc 安装。我马上就要放弃它,从头开始构建。 - kolosy
显示剩余4条评论

1

我有一个小笔记要贡献。在尝试跟随这篇文章时,我开始安装了三个Python版本:

  1. 默认的Apple Python 2.5.1位于:/usr/bin/python
  2. 一个版本位于:/Library/Frameworks/Python.framework/Versions/2.7
  3. 还有一个Macport版本位于:/opt/local/bin/python2.6

我的问题是:

$ python

每次我需要使用Macports版本时,它总是默认为2.7。以下方法都没有帮助:

$ sudo python_select python26

我甚至删除了2.7版本,因为它只会导致出错。

我发现我需要使用以下方法将默认路径更改为Macports版本:

$ PATH=$PATH\:/opt/local/bin ; export PATH

然后重新初始化端口等。

最后,我无法通过这些说明默认引用scrapy-ctl.py文件,因此我不得不直接引用scrapy-ctl.py文件。

/opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin/scrapy-ctl.py

更新

在这篇文章中,我们快速补充一下如何创建链接的说明,可以在Scrapy网站上找到(#2和#3)

从第二步开始,“将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

第三步,"使scrapy命令可用"

sudo ln -s /opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin/scrapy-ctl.py /usr/local/bin/scrapy

0

正在尝试安装,但仍然苦苦挣扎。 当我:

sudo /opt/local/bin/easy_install-2.6 scrapy

我收到错误信息并停止了

AttributeError: 'NoneType' object has no attribute 'get'

相反,我从头开始构建了Scrapy,它运行良好。

然后我尝试了你写的内容。

cd /path/to/scrapy
sudo /opt/local/bin/python2.6 setup.py install

/path/to/scrapy在哪里?是这个吗:

/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-0.8-py2.6.egg

还是在其他地方?


0

感谢@Ned Deily

如果您想在OS X 10.6上运行Scrapy 0.8,这些步骤似乎是有效的。它使用Macports安装Python 2.6而不是与操作系统捆绑的Python。这些步骤假设尚未安装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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接