如何在Yosemite上设置lxml和pypy?

时间:2014-12-28 10:40:07

标签: python macos lxml pypy

我想用lxml和pypy做一些学习,所以我决定在我的Yosemite Mac上设置它。但经过三天的尝试,我仍然无法尝试lxml,因为我无法正确设置。

这就是我所做的:

  1. 干净的homebrewxcode-select --install安装

    proix:~ user$ brew --version
    0.9.5
    
    proix:~ user$ gcc --version
    Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
    Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
    Target: x86_64-apple-darwin14.0.0
    Thread model: posix
    
  2. 酿造libxml2libxslt - libxml2代码tar 3.4.1和libxslt代码tar 1.1.28;工作得很好。建立并安装了Lib。

    proix:~ user$ brew list
    libxml2 libxslt
    
    proix:~ user$ brew info
    2 kegs, 409 files, 14M
    
    proix:~ user$ ll /usr/local/Cellar/libxml2/2.9.2/lib/
    total 6096
    drwxr-xr-x   8 user  admin      272 27 Dez 11:46 .
    drwxr-xr-x  13 user  admin      442 27 Dez 11:46 ..
    drwxr-xr-x   3 user  admin      102 27 Dez 11:46 cmake
    -r--r--r--   1 user  admin  1184284 27 Dez 11:46 libxml2.2.dylib
    -r--r--r--   1 user  admin  1922024 27 Dez 11:46 libxml2.a
    lrwxr-xr-x   1 user  admin       15 27 Dez 11:46 libxml2.dylib -> libxml2.2.dylib
    drwxr-xr-x   3 user  admin      102 27 Dez 11:46 pkgconfig
    -r--r--r--   1 user  admin      269 27 Dez 11:46 xml2Conf.sh
    
    proix:~ user$ ll /usr/local/Cellar/libxslt/1.1.28/lib/
    total 1440
    drwxr-xr-x  10 user  admin     340 27 Dez 12:10 .
    drwxr-xr-x  13 user  admin     442 27 Dez 12:10 ..
    -r--r--r--   1 user  admin   76728 27 Dez 12:10 libexslt.0.dylib
    -r--r--r--   1 user  admin  101832 27 Dez 12:10 libexslt.a
    lrwxr-xr-x   1 user  admin      16 27 Dez 12:10 libexslt.dylib -> libexslt.0.dylib
    -r--r--r--   1 user  admin  214344 27 Dez 12:10 libxslt.1.dylib
    -r--r--r--   1 user  admin  326040 27 Dez 12:10 libxslt.a
    lrwxr-xr-x   1 user  admin      15 27 Dez 12:10 libxslt.dylib -> libxslt.1.dylib
    drwxr-xr-x   4 user  admin     136 27 Dez 12:10 pkgconfig
    -r--r--r--   1 user  admin     288 27 Dez 12:10 xsltConf.sh
    
  3. 但是这些新版本没有被使用:

    $ xmllint --version
    xmllint: using libxml version 20900
    
  4. 所以我通过恢复控制台(启动时cmd + R)切换/usr/lib下的库。重新启动后,我得到了预期的结果:

    $ xmllint --version
    xmllint: using libxml version 20902`
    

    一句警告!在正常登录会话期间,请勿尝试执行此操作。如果操作系统再也找不到libxml2.dylib,那么它会让你的系统无用。

  5. 创建一个用于测试的virtualenv:

    virtualenv lxmllab
    source lxmllab/bin/activate`
    
  6. 使用STATIC_DEPS=true sudo pip install lxml安装lxml。工作得很好:

    (lxmllab)proix:~ user$ pip list
    backports.ssl-match-hostname (3.4.0.2)
    certifi (14.5.14)
    cffi (0.6)
    docutils (0.12)
    ipython (2.3.1)
    Jinja2 (2.7.3)
    lxml (3.4.1)
    MarkupSafe (0.23)
    nose (1.3.4)
    numpydoc (0.5)
    pip (6.0.3)
    py (1.4.26)
    Pygments (2.0.1)
    pyzmq (14.4.1)
    setuptools (8.2.1)
    Sphinx (1.2.3)
    tornado (4.0.2)
    
  7. 测试一下:

    (lxmllab)proix:~ user$ pypy -c 'from lxml import etree'
    Unknown libxml2 version: 20902
    Traceback (most recent call last):
      File "app_main.py", line 72, in run_toplevel
      File "app_main.py", line 562, in run_it
      File "<string>", line 1, in <module>
      File "lxml.etree.pyx", line 270, in init lxml.etree (src/lxml/lxml.etree.c:199039)
      File "lxml.etree.pyx", line 235, in lxml.etree.__unpackDottedVersion (src/lxml/lxml.etree.c:9383)
    TypeError: unsupported operand type for int(): 'unicode'
    
    (lxmllab)proix:~ user$ pypy
    Python 2.7.3 (5acfe049a5b0, May 21 2013, 13:47:22)
    [PyPy 2.0.2 with GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    And now for something completely different: ``redefining yellow seems like a
    better idea''
    ---- from lxml import etree
    Unknown libxml2 version: 20902
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "lxml.etree.pyx", line 270, in init lxml.etree (src/lxml/lxml.etree.c:199039)
      File "lxml.etree.pyx", line 235, in lxml.etree.__unpackDottedVersion (src/lxml/lxml.etree.c:9383)
    TypeError: unsupported operand type for int(): 'unicode'
    ---- 
    
  8. 那是我被困的地方。我尝试了几个修复,但无济于事:

    • LD_LIBRARY_PATH和/或DYLD_LIBRARY_PATH设置为libxml2的位置。
    • 将libxml2 dylibs复制到virtualenv site-packages/lxml文件夹。

    有没有人知道我应该怎样做才能使这个工作,或者在Yosemite下使lxml lib工作的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

PyPy不能与lxml一起使用(至少不是很好,即使它不小心),因为lxml是在使用CPython C API绑定的Cython之上构建的。考虑使用lxml-cffi而不是https://github.com/amauryfa/lxml/tree/cffi