歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Unix知識 >> BSD

在FreeBSD的virtualenv環境下安裝pysqlite和gevent

virtualenv是個好東西,可以為各個python應用建立各自獨立的虛擬環境,對於開發和部署都是很有用的。特別是增強版的virtualenvwrapper,好用到爆。

但是它也會帶來很妖蛾子的問題。比如之前我就曾經碰到過這樣的問題:

題外話:Mac OS X 10.6 Snow Leopard 下 virtualenv 發生 install_name_tool 錯誤

在Mac OS X 10.6 SL下創建virtualenv失敗,報一個install_name_tool錯誤。搜了很久都沒有找到可行的解決方案——所有的解決方案都指向一個:

安裝最新版的XCode或其簡化版的Command Line Tools包,但是最新版的XCode或CLT都需要系統升級到10.7.3 Lion以上…

雖然最新的10.8 ML也就賣128塊,只是我是很不喜歡升級系統的,雖然OS X的升級據說是很平滑的,但保險起見還是需要備份什麼的,而且系統升級完會有很多應用也要跟著升級,總之是麻煩。之前用Ubuntu 10.04足足用了兩年,一直等到下一個LTS 12.04出來才換掉。而且有很多人升級到ML後都反映速度慢了很多,搞得我就更加不想升了。

後來總算有人說不安裝最新的XCode也可以,只要升級到當前系統支持的最高版本XCode即可,於是我花了一個下午時間把SL上能用的最高版本XCode 3.2.6下載來安裝了一下才總算解決。

當 virtualenv 遇上非純 python 包

一般來說純python的包在virtualenv裡安裝是完全沒有問題的,不論是用easy_install還是用pip都很方便。順便說一句,個人比較推薦用pip,比easy_install好用很多。

問題就在於非純python包,這種情況通常會需要編譯一些C或C++代碼來生成一些庫。對於非virtualenv來說通常也沒啥麻煩的,比如Debian/Ubuntu可以找到相應的apt包來安裝,FreeBSD通常也有相應的Ports包可以安裝。

但是當virtualenv遇上非純python包,問題就來了。

相對來說Debian/Ubuntu下還會略好一些,無非是需要先在主環境裡安裝一些dev包而已,之後在virtualenv裡用pip/easy_install安裝時就可以自動編譯安裝了。

對於FreeBSD來說,情況就要麻煩一些了,因為用Ports安裝本來就是源碼編譯的,所以沒有另外的dev包可裝,因此需要解決一些路徑問題才能順利編譯。

其實這個問題我之前也碰到過,也解決了,只是這次再碰到怎麼也想不起來上次是怎麼解決的,折騰了好長時間,所以還是記下來備查為好。

至於說為什麼以上只討論了Linux/FreeBSD/Mac OS X,沒有提到 Windows 呢?那當然是因為:珍愛SM,遠離MS。在Windows下用virtualenv基本上跟找死差不多,很多問題根本沒有解決方案…

FreeBSD 9 的 virtualenv 裡安裝 pysqlite 錯誤

首先來看pysqlite。

其實本來Python 2.5以上就內置了對sqlite的支持,但是因為我一直是用sqlalchemy,它是用這個庫的,所以還是需要安裝一下。

直接在 virtualenv 裡用:

pip install pysqlite

的話會報編譯錯誤,找到不 sqlite3.h 這個頭文件。

解決方法是:

workon yourenv
pip install --no-install pysqlite
# 這是 virtualenvwrapper 的命令,如果是 virtualenv 請直接用 cd 命令去相應的路徑下
cdvirtualenv build/pysqlite
vim setup.cfg
# 把其中include_dirs和library_dirs兩個路徑的注釋去掉,保存退出後重新安裝
pip install pysqlite

即可。

FreeBSD 9 的 virtualenv 裡安裝 gevent 錯誤

方法與上面的類似,不過這次不用修改什麼文件,而是直接在build裡去安裝。

workon yourenv
pip install --no-install gevent
# 這是 virtualenvwrapper 的命令,如果是 virtualenv 請直接用 cd 命令去相應的路徑下
cdvirtualenv build/gevent
# 下面這個是我這裡的 libevent 所在的 Ports 位置,請根據你自己的情況修改
python setup.py install --libevent /usr/ports/devel/libevent/work/libevent-1.4.14b-stable
# 下面這句只是為了做一些安裝後的收尾工作,比如清除build目錄內容等
pip install gevent

即可。

Copyright © Linux教程網 All Rights Reserved