美文网首页
关于在osx EI 上装scrapy环境的问题&解决方法

关于在osx EI 上装scrapy环境的问题&解决方法

作者: findsomeoneys | 来源:发表于2016-06-12 20:59 被阅读179次

    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朋友.

    相关文章

      网友评论

          本文标题:关于在osx EI 上装scrapy环境的问题&解决方法

          本文链接:https://www.haomeiwen.com/subject/opaedttx.html