关于在osx EI 上装scrapy环境的问题&解决方法
mac环境下安装scrapy的问题
- 安装scrapy依赖的模块之一six
OSError: [Errno 1] Operation not permitted:
- 安装完成后运行scrapy时导入的模块错误
ImportError: cannot import name xmlrpc_client
一开始的解决办法
经过网上一番搜索后,看到了这篇文章安装Scrapy 1.0.3,安装成功
具体来说就是使用sudo pip install scrapy --ingnore-installed six
命令安装scrapy
安装成功之后还需要在命令行中打export PYTHONPATH=/Library/Python/2.7/site-packages:$PYTHONPATH
然后再运行scrapy
照着这个教程很快安装好了scrapy于是开始干活了.但是过了一段时间之后,因学习需要参考了别人的项目,gitclone了一份分析之后想运行看看效果,很悲剧的又出现了ImportError: cannot import name xmlrpc_client
问题.当时觉得比较奇怪,自己的scrapy可以运行为什么到这个新的项目不可以呢?在网上搜的解决方法,又重新遇到了最初的问题OSError: [Errno 1] Operation not permitted:
也正是因为这个原因,让我下定决心去思考下出现这些问题的背后根本原因是什么? 有没有什么更好的解决方法?
问题分析
完全解决了我心中的困惑是看到了最近发表的一篇博文解决mac osx下pip安装ipython权限的问题
其实权限问题… OSError: [Errno 1] Operation not permitted , 各种的root都不可以,想到了一个粗暴的方式,直接针对share进行chmod的授权。 结果… 提示root也是没有权限操作系统的目录。 我突然发觉肯定是新版的osx有了某种机制制止我们直接的修改/System文档数据。
google了后,发现果然如我的所料…. 新系统有个叫sip的机制。 你暂时不能直接在终端进行 csrutil disable 会出现错误提示,引导你去mac osx的恢复模式进行操作。
由于El Capitan引入了SIP机制(System Integrity Protection),默认下系统启用SIP系统完整性保护机制,无论是对于硬盘还是运行时的进程限制对系统目录的写操作。 这也是我们安装ipython失败的原因….
看到这里我突然想起当初解决的安装six模块时候使用的命令
sudo pip install scrapy --ingnore-installed six
当时只想解决问题,并没有考虑到这条命令背后的作用.现在回想起来注意到了命令后面加的参数--ingnore-installed six
那么当时出现的 Operation not permitted
是不是也因为six本身是系统的目录的一部分呢?
经过一番搜索,果然osx系统自带了一份six模块,并且是在系统目录里面的
这就是为什么我们当初使用pip install scrapy
时候会出现报错了.因为安装依赖six模块需要更改系统目录下的six模块,而因为osx Ei Capitan新引用的SIP机制在,所以我们无法修改
解决方法
解决方法有两种
1.既然已经知道了是sip机制在从中作梗,那么把他关掉就可以了.在那篇博文中也详细列出了关闭的方法
现在的解决办法是取消SIP机制,具体做法是:
重启电脑,按住Command+R(直到出现苹果标志)进入Recovery Mode(恢复模式)
左上角菜单里找到实用工具 -> 终端
输入csrutil disable回车
重启Mac即可
如果想重新启动SIP机制重复上述步骤改用csrutil enable即可
我们现在再看看sip的状态, 这样再安装ipython、gevent再也不会提示无法写入的权限提示了/
不过这个方法是我解决问题之后才看到的,所以可行性还待验证
2.使用homebrew
homebrew简称brew,是类似Red hat的yum,Ubuntu的apt-get软件包依赖工具.
而且好处是安装的东西默认都会放在usr/local/lib/
里面.这样需要系统权限的问题
这是官网 homebrew
你要做的很简单,只需在命令行中
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
在安装成功之后,可能需要在.bashrc里面加入(这一步不一定需要)
export PATH=/usr/local/bin:/usr/local/sbin:$PATH
然后再
homebrew install python
同时这个会帮你把系统默认的python切换到homebrew安装的python目录下,完成之后再
sudo pip install scrapy
就可以了
运行过程中的cannot import
在项目里我使用了一个jpype的模块.但是在scrapy运行的时候却出现cannot import jpype
.这个让我比较纳闷,因为我确实安装成功了.在python shell里面我敲入import jpype
也能成功导入.想来想去可能是因为bash里面没有加入这个模块的python path.于是我尝试在命令行里面打
export PYTHONPATH=jpype的目录:$PYTHONPATH
再运行scrapy的项目.成功了.
感想
mac下装scrapy环境说实话感觉是比较坑,而且当出现问题时候第一想法就是复制报错内容去搜索,这样得出的解决方法只能解决一时燃眉之急,却没有根本解决问题. 解决了sip机制问题的并不一定也恰好需要使用scrapy这些我们也无法搜到,所以也有了写这篇文章记录下来想法,方便同样需要装scrapy朋友.