【问题标题】:do i need 32bit libxml2 for python on snow leopard?我需要 32 位 libxml2 用于雪豹上的 python 吗?
【发布时间】:2010-03-01 05:00:27
【问题描述】:

我在我的 sl mbp 上安装 scrapy 时遇到了麻烦。它需要libxml2,所以我开始安装它。从 macports 安装它似乎并没有拉下 python 绑定。

通过 scrapy 的说明 (here) 从源代码安装它确实安装了 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 位时,该错误消失了,但由于其他一些库不是 32 位,因此 libxslt 将无法构建。我害怕继续拉那根绳子。所以问题是-python 仅 32 位吗?我在这里做傻事吗?

编辑 - 这是python 2.6

edit 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 安装 pre-reqs

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 的路径中有一些空格,这只是剪切和粘贴错误吗? (因为在两个不同的地方并不明显)
  • 剪切和粘贴错误。终端 -> 所以 4-space-for-code-indent == 间距混乱

标签: python macos osx-snow-leopard libxml2


【解决方案1】:

从您的回溯中的路径来看,您似乎已经安装并正在尝试使用 python.org python 2.6.4(安装到/Library/Frameworks/Python.frameworks ...)。那个python只有32位。默认情况下,MacPorts 在 10.6 上尝试安装 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 版本。我在/opt/local/etc/macports/variants.conf 10.6 中添加了以下变体(并非所有变体都适用于 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 安装程序。但你真的不应该这样做。而且我认为修复此问题并使其正常工作确实符合您的最大利益,因为它可能会在将来为您省去很多麻烦。

【讨论】:

  • 虽然我不得不说,那个端口安装正在关闭所有系统 5。呃。 wtf x11 和 python 有关系吗!?@。呸!
  • 仔细检查...来自 mp 的 python26 是 32 位的。它与我已经拥有的 10/27/09 版本相同,并且不是 32 位的。除非我做错了什么。
  • 很抱歉引入 x11。我已经更新了答案,包括指定一些变体以防止在 10.6 中出现这种情况。原始问题中的回溯显示/Library/Frameworks/Python....。这不是安装 MacPorts 的 Python 的路径。它适用于 python.org Python 等,或 build-from-source 框架安装。
  • 谢谢,但是端口有些令人困惑,因为它告诉我它已安装: $ 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
  • 检查你的shell $PATHwhich python 的输出,以确定你正在调用哪个python。在 OS X 上很容易混淆,在不同位置安装多个版本并不罕见。使用绝对路径会有所帮助:/opt/local/bin/python2.6 用于 MacPorts,/usr/local/bin/python2.6 用于 python.org,/usr/bin/python2.6 用于 Apple 在 10.6 中提供的 Python。
【解决方案2】:

我有一个小笔记要贡献。在尝试跟进这篇文章时,我开始安装三个 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

更新

此帖子的快速附录,其中包含创建链接的说明,找到 on the Scrapy site(#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

【讨论】:

    【解决方案3】:

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

    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
    

    还是在别的地方?

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-10
        • 1970-01-01
        • 2012-12-10
        • 2011-03-05
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 2010-12-04
        相关资源
        最近更新 更多