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