我有一段时间在我的sl mbp上安装scrapy了.它需要libxml2,所以我开始安装它.从macports安装它似乎没有拉下python绑定.
通过scrapy的说明从源代码安装它(here)会安装python绑定,但是当我运行’python -c“时导入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 32bit吗?我在这里做些蠢事吗?
编辑 – 这是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的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的.
测试是否存在正确的体系结构:运行文件’哪个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的详细回复.
解决方法:
从traceback中的路径看,您已经安装并尝试使用python.org python 2.6.4(安装到/Library/Frameworks/Python.frameworks …).那个python只有32位.默认情况下,10.6,MacPorts尝试安装64位版本的软件包.您可以通过在MacPorts安装命令上指定通用变体或将其添加到/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
如果您添加了通用变体,那么您可能只看到一个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安装程序.但你真的不应该这样做.而且我认为将这个问题固定下来并确保工作真的符合您的最佳利益,因为它可能会为您节省很多麻烦.