上回书说到,给python3.5编译安装pycairo时,configure阶段卡住了:总是在生成的Build.py中报一个无法pickle局部对象的错误:
AttributeError: Can't pickle local object 'Context.__init__..node_class'
昨天发邮件询问有了回音,对方给了一个stackoverflow上的一个帖子:Not finding python3 when installing pycairo,虽然主贴不是这个内容,但是下面的回复中提到一个补丁,我看了一下,就是让Build.py中报错的那个store函数直接return,干脆不执行其内容。
我照做,果然上个错误消失,但是又遇到了新的坑:执行configure时报错:
command ['/usr/bin/python', '/usr/local/bin/python3.5-config', '--includes'] returned 1
想起昨天的网站上提供了两个补丁的下载,于是抱着试试看的心态看看补丁文件里面都写了啥,果然,补丁文件pycairo-1.10.0-waf_python_3_4-1.patch中的内容如下:
Submitted by: Wayne Blaszczyk (wblaszcz at bigpond dot net dot au)
Date: 2014-03-27
Initial Package Version: 1.10.0
Upstream Status: unknown
Origin: Gentoo
URL: https://bugs.gentoo.org/show_bug.cgi?id=504342
Description: Fix build with Python-3.4
--- a/waflib/Tools/python.py
+++ b/waflib/Tools/python.py
@@ -169,7 +169,7 @@
conf.find_program('python-config-%s'%num,var='PYTHON_CONFIG',mandatory=False)
includes=[]
if conf.env.PYTHON_CONFIG:
- for incstr in conf.cmd_and_log(conf.env.PYTHON+[conf.env.PYTHON_CONFIG,'--includes']).strip().split():
+ for incstr in conf.cmd_and_log([conf.env.PYTHON_CONFIG,'--includes']).strip().split():
if(incstr.startswith('-I')or incstr.startswith('/I')):
incstr=incstr[2:]
if incstr not in includes:
仔细看,替换的一行内容跟上面的报错内容似乎正好匹配。于是果断按照这个补丁的指示手工修改waflib/Tools/python.py文件(好吧我承认忘了怎么应用补丁文件了),接下来果然一切顺利啦~
特此记录。