如何在OSX上安装Pycairo?

13

我正在尝试在OSX上安装pycairocairo图形库的Python绑定)。

我从以下内容开始:

easy_install pycairo

得到的结果:

Requested 'cairo >= 1.8.8' but version of cairo is 1.0.4

error: Setup script exited with Error: cairo >= 1.8.8 not found

我去了cairo的网站并下载了最新的cairo软件包(1.8.8),以及另一个叫做pixman的东西的最新软件包(两个都是源代码包——找不到osx二进制文件)

将它们解压缩,每个放在自己的目录中。 对于pixman,常规的./configure ; make ; sudo make install 命令正常工作。 对于cairo,./configure 看起来正常,但是make失败了,出现以下错误:

In file included from cairo-analysis-surface.c:37:
cairoint.h:71:20: error: pixman.h: No such file or directory

我做错了什么?

为什么我必须费尽周折才能让一个软件库在一个“只是工作”的操作系统上运行? 为什么Darwin不更像Linux?


更新:我将pixman目录中的所有.h文件复制到cairo中。这是一个丑陋的蛮力方法,但似乎可以工作:“make; sudo make install”似乎很好用。然而,当我尝试安装pycairo时,仍然会出现“请求'cairo >= 1.8.8',但cairo版本为1.0.4”的错误。它认为我有cairo 1.0.4,并忽略了新版本。有什么想法吗?我该如何解决? - Yoav
6个回答

14
如果您已经安装了Homebrew,这两个命令应该会有所帮助:
$ brew install cairo --use-clang 
$ brew install py2cairo

对于非Homebrew安装的Python,设置PYTHONPATH以查找pycairo。您可以在.bashrc/.profile/.whatever中将PYTHONPATH设置为以下内容:

export PYTHONPATH=/path/to/pycairo:$PYTHONPATH
PYTHONPATH=/usr/local/lib/python2.7/site-packages:$PYTHONPATH.

个人而言,我不需要使用这最后一部分,但它可能会对你有所帮助。


3
如果您正在使用Python 3,可以使用“brew install py3cairo”代替。 - Georges Oates Larsen
Error: invalid option: --use-clang; Then: brew install cairo --cc=clang; Then: Error: cairo: no bottle available! - Dr.jacky
brew install py2cairo 是无效的。 - ABCD

7

好的。我解决了。将解决方案放在这里供以后参考,可能会对某些人有帮助。

基本上,整个端口/ Fink 系统有点混乱,而且 osx 并不真正和 Linux 的世界相处愉快。

因此,我在 OSX 上安装 pycairo 需要的步骤是:

  • download the latest source versions of pixman, cairo, pycairo
  • extract everything. Then:

    cd PIXMAN_DIR ; ./configure ; make ; sudo make install 
    cd CAIRO_DIR ; cp PIXMAN_DIR/pixman/*.h . ; ./configure ; make ; sudo make install
    cd PYCAYRO_DIR; locate cairo.pc 
    

    hopefully, several locations are returned. choose the most likely one (one with newest cairo). For me it was "/opt/local/lib/pkgconfig/cairo.pc" and do:

    export PKG_CONFIG_PATH=/opt/local/lib/pkgconfig/
    

    after this, still in PYCAIRO_DIR, do:

    python setup.py install
    
这应该可以做到...

1
我认为你有问题,因为你混合了macports fink和自己的代码 - 只使用其中一个即可 ;) 这些中的每一个都相当于Linix的自己的打包系统。我这么说的原因是,/opt/local/bin将来自Macports而不是默认情况下将是/ usr / local / bin的你自己的代码。 - mmmmmm
请问您能否为这些库添加下载来源和文件名呢? - Rishabh Gupta

7
看起来您在混合使用各种安装选项。MacPorts软件包系统的port install命令应自动拉取特定软件包所需的所有依赖项,因此关键是从正确的顶级项目开始。对于Python软件包,MacPorts目前有一个通用约定:以py -开头的包适用于Python 2.4,以py25-开头的包适用于2.5,而以py26-开头的包适用于2.6。MacPorts目前提供了py-cairopy25-cairopy26-cairo软件包。
通过选择py-cairo,您选择了Python2.4版本,并且您可能会发现MacPorts已经为您构建并安装了Python2.4(链接到/ opt / local / bin / python2.4 ),如果您启动它,您可能会发现可以在其中导入cairo。现在,这可能符合您的需求,但是Python 2.4非常老旧,不再受支持,因此,如果您刚刚开始,最好从Python 2.6开始,即Python的两个当前版本之一。要这样做,您所需要做的就是:
sudo port install py26-cairo

这样可以引入任何缺失的依赖项,主要是MacPorts python2.6,您可以从/opt/local/bin/python2.6运行。 您可能需要更改您的shell启动脚本(通常是.bash_profile),将/opt/local/bin放在搜索路径的前面。

由于安装Cairo及其Python绑定似乎相当复杂,因此最好坚持使用完整的MacPorts解决方案。 这意味着您不必要地(但无害地)安装了一些不需要的Python实例。 但是,如果您确实想清理一下,可以轻松删除MacPorts python24:

sudo port uninstall py-cairo python24

完全删除 python.org 安装的 Python 更为复杂。我在这里解释了这个过程。但只要你保持路径正确,没有必要移除任何一个。


我尝试了您的建议,成功地解决了问题。非常感谢您。我认为我的主要问题是我不熟悉macports和macOS的机制和约定。我已经阅读了macports.org的介绍和文档,但我从未意识到版本号会出现在标题中(我以为它会自动使用最新版本或其他什么方式)。 - Akusete
是的,MacPorts的Python命名规则相当令人困惑。如果他们一开始使用py24-而不是py-,可能会好一些。很高兴一切都顺利! - Ned Deily
你如何使 cairo.HAS_QUARTZ_SURFACE 的值为1? - vy32
vy32,如果你在评论中提出一个无关的问题,很可能得不到答案。请创建一个新的问题,并提供足够的上下文,以便人们能够给出明智的答案。 - Ned Deily

3
< p > port 命令安装 darwinports python 安装所需的库,这与框架构建不同(因此步骤2和3不应该起作用)。相反,尝试使用 sudo easy_install pycairo (虽然您的步骤4应等效于此)。

还要查看 which python,以检查您实际上是否正在运行您认为的 python 版本。


这里有另一个遇到类似问题的人(https://dev59.com/r3I_5IYBdhLWcg3wK_o6)。 - Michael Dunn
如果你不小心这样使用easy_install,会进一步使事情复杂化,因为它会引入由Apple提供的Python,并且不能解决根本问题。 - Ned Deily
我理解Akusete的意思是他想要在Python2.6.4框架中使用pycairo(他的第一步)。如果他能够让它正常工作,他就可以放弃所有的MacPorts python相关内容,并避免将来出现这个问题。但你提供的全面使用MacPorts的解决方案也很好。有没有任何理由更喜欢它呢? - Michael Dunn
获取所有依赖库并正确链接可能会很棘手(我还没有查看pycairo安装文件,以查看它们是否在MacPorts位置检查库)。更重要的是,默认情况下,普通的easy_install命令很可能会调用由苹果提供的/usr/bin/easy_install命令,该命令将在Apple提供的默认Python的site-packages目录中安装pycairo,而不是python.org 2.6.4;为此,您需要为该python安装单独的easy_install(来自setuptools或Distribute)。 - Ned Deily
你如何使 cairo.HAS_QUARTZ_SURFACE 返回1? - vy32
处理 pycairo-1.10.0.tar.bz2 错误:在 /tmp/easy_install-tooeLq/pycairo-1.10.0.tar.bz2 中找不到安装脚本。 - user391339

2
在Mac OS上,您可以安装多个Python版本。如果您决定通过Fink或MacPorts安装Python,则甚至可以安装更多版本。当您从源代码编译库时,您应该确保它们指向正确的安装位置。
我当前在我的计算机上安装了Python 2.5.1和Python 2.6.4,可以通过python2.5python来调用它们。它们位于两个不同的文件夹中: /System/Library/Frameworks/Python.framework/Versions/2.5/Library/Frameworks/Python.framework/Versions/2.6 当我从tarball编译pycairo 1.8.8时,遇到了类似的问题。在这种情况下,INSTALL文件是您的朋友,因为它包含了避免潜在版本冲突的正确说明。您基本上需要指定正确的前缀,以便将软件包安装在正确的文件夹中。
$ python -c "import sys; print sys.prefix"
  # 记下Python的前缀
$ ./configure --prefix=[python_prefix]
$ make
$ make install       # 可能需要超级用户访问权限
使用python2.5python运行这些说明,您将能够正确地为两个版本(或通过MacPorts / Fink安装的任何版本)安装pycairo。

1

步骤1:从终端运行以下命令:ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null

步骤2:brew install cairo

步骤3:pip install pycairo


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