解决方法,我们用mac遇到的梗

2019-12-05 07:14 来源:未知

scrapy的安装

  1. 安装homebrew
    homebrew是Mac端的一个软件包管理系统,通过它可以很方便地通过控制台命令安装程序。打开终端,输入(把下面的直接复制就行了):
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

  2. 用homedrew安装python

mac环境下安装scrapy的问题

  • 安装scrapy依赖的模块之一six
    OSError: [Errno 1] Operation not permitted:
  • 安装完成后运行scrapy时导入的模块错误
    ImportError: cannot import name xmlrpc_client

场景描述

最近公司业务不是很忙,想从网上找点资料出来,用来.....(你懂得,,,别想歪,我是正经人!)
由于本人是做java的,之前一直在用jsoup来玩爬虫,听说python的scrapy爬虫简直就是搜易贼(so easy)。
哪就走起吧.

用homedrew安装python只要一行命令,然后等着就好了:

一开始的解决办法

经过网上一番搜索后,看到了这篇文章安装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版本是OS X EI capitan。

brew install python

问题分析

完全解决了我心中的困惑是看到了最近发表的一篇博文解决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机制在,所以我们无法修改

问题描述

本机自带了python2.7,直接安装scrapy就可以了,
不过在安装scrapy之前要先确定你的电脑是否已经安装了pip。
如果没安装pip的话,打开终端(我用的itrem2),执行以下的命令
sudo easy_install pip
pip 和 easy_install 都是 Python 的框架管理命令,pip 是对 easy_install的升级。
安装完pip之后我们要开始安装scrapy了,打开终端执行

sudo pip install Scrapy

如果执行成功,那么 Scrapy 就安装成功了,但往往事与愿违,你很有可能遇到如下错误:

OSError: [Errno 1] Operation not permitted: '/tmp/pip-Tz8iWw-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.egg-info'

  1. 安装pip

解决方法

解决方法有两种

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

就可以了

故障定位

我google了好久,查了好多原因,试了很多种办法发现都没说道点子上,最后在以为大神的博客里找到了原因

Because six ships with the system, and almost every popular python project uses it for forwards compatibility, pip tries to upgrade the version it finds first in the python path. Since SIP blocks this, it fails.
Any python dependencies system software has should be hard-coded, and the default path should look in /Library/Python/2.7/site-packages first in order.

原文传送门
这时候,我们知道了新版的mac系统增加了sip特性,即使使用 sudo 也无法使获得最高权限,无法对 MAC 系统级的目录进行更改

最终TensorFlow还是通过pip来安装的,所以先安装pip。pip的版本是根据python版本来的。

运行过程中的cannot import

在项目里我使用了一个jpype的模块.但是在scrapy运行的时候却出现cannot import jpype.这个让我比较纳闷,因为我确实安装成功了.在python shell里面我敲入import jpype也能成功导入.想来想去可能是因为bash里面没有加入这个模块的python path.于是我尝试在命令行里面打

export PYTHONPATH=jpype的目录:$PYTHONPATH

再运行scrapy的项目.成功了.

解决问题

既然我们已经发现问题出现在sip上了,那我们把sip特性关闭了不就完了么,那么我们怎么关闭sip特性呢。

  • 重启 MAC ,在重启的过程中按住 Command+R,进入安全模式
  • 在顶部的菜单栏中打开终端 ,输入 csrutil disable 命令关闭 SIP 安全特性(想要在开启sip的话就用csrutil enable命令即可)
  • 重启 MAC就ok了

此时,sip特性已经被我们关闭了,你可以重新安装scrapy试试,打开终端执行

sudo pip install Scrapy

在短暂的安装过程等待过后,你原本期望的是安装成功的提示,但是你发现安装又tm的失败了,fuck。
这时候又发送什么原因了呢,看来下控制台,你发现了如下的错误
Scrapy throws ImportError: cannot import name xmlrpc_client
这货又是什么梗?
于是乎,又google了下,发现是six的版本太低了原文传送门
那我们更新下six的版本吧,打开控制台输入以下的命令

sudo rm -rf /Library/Python/2.7/site-packages/six*  
sudo rm -rf /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six*  
sudo pip install six

ok,我们把six的版本也更新完了,哪这时候我们再试下安装scrapy把.
这时候会提示你installation successful,那就恭喜你成功的解决了sip,并安装了scrapy.

python2.7:

感想

mac下装scrapy环境说实话感觉是比较坑,而且当出现问题时候第一想法就是复制报错内容去搜索,这样得出的解决方法只能解决一时燃眉之急,却没有根本解决问题. 解决了sip机制问题的并不一定也恰好需要使用scrapy这些我们也无法搜到,所以也有了写这篇文章记录下来想法,方便同样需要装scrapy朋友.

python3的安装

sudo easy_install pip

需求描述

大家应该都知道MAC OS X EI Capitan 系统 支持 python的多版本共存,即在我们的环境变量中可以配置python2和python3。

sudo easy_install --upgrade six
python3:

安装过程

  1. 先安装python3,如果你安装了homebrew,那么你只需要输入一条命令brew install python3即可安装python3

  2. 此时你可以输入python3试试,但是你发现这时候系统会提示命令找不到(你都没配置python3,系统找个毛啊)

  3. 这时候我们进行配置了,首先把安装好的 Python3 目录移到原本系统所持有的目录位置,在终端输入以下命令:
    sudo mv /usr/local/Cellar/python3/3.5.0/Frameworks/Python.framework/Versions/3.5 /System/Library/Frameworks/Python.framework/Versions
    注意:/usr/local/Cellar/python3/3.5.0/Frameworks/Python.framework/Versions/3.5是你的python3的安装路径,一般用homebrew安装的会是这个路径,如果你从官网下载安装的不一定是这个路径,具体路径请参考你的python3的安装路径

  4. 然后修改文件所属的 Group 设置 Group 为 wheel,在终端内输入以下命令sudo chown -R root:wheel /usr/local/Cellar/python3/3.5.0/Frameworks/Python.framework/Versions/3.5

  5. 重新链接可执行文件

 sudo ln -s /usr/local/Cellar/python3/3.5.0/Frameworks/Python.framework/Versions/3.5/bin/pydoc3.5 /usr/bin/pydoc3  
 sudo ln -s //usr/local/Cellar/python3/3.5.0/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /usr/bin/python3
 sudo ln -s /usr/local/Cellar/python3/3.5.0/Frameworks/Python.framework/Versions/3.5/bin/pythonw3.5 /usr/bin/pythonw3
 sudo ln -s /usr/local/Cellar/python3/3.5.0/Frameworks/Python.framework/Versions/3.5/bin/python3.5m-config /usr/bin/python3-config  

sudo easy_install pip3

查看结果

在终端里输入 python3 ,会出现如下提示,说明配置成功:

Python 3.5.0 (default, Sep 23 2015, 04:41:38)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0   
(clang-700.0.72)] on darwin  
Type "help", "copyright", "credits" or 
"license" for more information.

sudo easy_install --upgrade six

  1. 引入TensorFlow的正确版本的URL

这里要根据自己的python版本来选择对应的TensorFlow的包。

TAG标签:
版权声明:本文由金沙澳门官网4166发布于世界史,转载请注明出处:解决方法,我们用mac遇到的梗