【问题标题】:How can I set up lxml and pypy on Yosemite?如何在 Yosemite 上设置 lxml 和 pypy?
【发布时间】:2015-02-24 20:34:55
【问题描述】:

我想学习一下 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;工作正常。构建并安装了库。

    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. 所以我通过故障恢复控制台切换了/usr/lib 下的库(在引导期间使用 cmd+R)。重新启动后,我得到了预期的结果:

    $ 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'
    ---- 
    

这就是我卡住的地方。我尝试了一些修复方法,但无济于事:

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

有人知道我应该怎么做才能让它工作,或者让 lxml 库在 Yosemite 下工作的正确方法是什么?

【问题讨论】:

    标签: python macos lxml pypy


    【解决方案1】:

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

    【讨论】:

    • 嗨...感谢您的帮助...花了一段时间才找到时间,但最终我找到了... :-) 不得不升级到更新版本的 pypy (2.4. 0),但后来我得到了lxmlx-cffi 版本,可以完美运行我的实验。 $ pip list cffi (0.8.6) greenlet (0.4.0) lxml (3.4.0) pip (6.0.3) readline (6.2.4.1) setuptools (8.2.1) $ pypy Python 2.7.8 (f5dcc2477b97, Sep 19 2014, 18:09:54) [PyPy 2.4.0 with GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.38)] on darwin ---- from lxml import etree ---- 干得好!非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2019-06-06
    • 2018-05-29
    • 2015-06-29
    • 1970-01-01
    相关资源
    最近更新 更多