參考鏈接:https://ruiaylin.github.io/2014/12/12/python%20update/
前提:centos6.8虛擬機(jī)眉菱,新機(jī)器踊跟,很多包都沒有
centos6.8自帶python是2.6姨拥,項目需要python2.7
注意:
因為是新機(jī)器绣檬,所以os上很多依賴包都沒有璧眠。我第一次參考鏈接的方式安裝2.7缩焦,結(jié)果在執(zhí)行python get-pip.py中報錯:zipimport.ZipImportError: can't decompress data; zlib not available读虏。查看了一些文檔,都然并卵袁滥。必須執(zhí)行下面的語句盖桥,python get-pip.py才能執(zhí)行成功。(update應(yīng)該可選题翻,未親測)
yum -y update
yum groupinstall -y 'development tools'
yum install -y zlib-devel bzip2-devel openssl-devel xz-libs wget
1.下載python2.7.9的包:
wget http://www.python.org/ftp/python/2.7.9/Python-2.7.9.tar.xz
xz -d Python-2.7.9.tar.xz
tar -xvf Python-2.7.9.tar
2.安裝
cd Python-2.7.9
./configure --prefix=/usr/local/python2.7
(注:
./configure --prefix=/usr/local說明揩徊。不指定prefix,則可執(zhí)行文件默認(rèn)放在/usr/local/bin嵌赠,庫文件默認(rèn)放在/usr/local/lib塑荒,配置文件默認(rèn)放在/usr/local/etc。其它的資源文件放在/usr /local/share姜挺。所以沒有特殊要求齿税,省略--prefix就可以了。你要卸載這個程序炊豪,要么在原來的make目錄下用一次make uninstall(前提是make文件指定過uninstall),要么去上述目錄里面把相關(guān)的文件一個個手工刪掉凌箕。
指定prefix,直接刪掉一個文件夾就夠了)
make && make install
3.修改/usr/bin/python軟連词渤,指向python2.7
ln -sf /usr/local/python2.7/bin/python2.7 /usr/bin/python
測試:
# python
Python 2.7.9 (default, Mar 29 2017, 14:50:12)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
成功牵舱。
/usr/local/php5/sbin/php-fpm --prefix /usr/local/php5 --fpm-config /usr/local/php5/etc/php-fpm.conf --pid /Users/liuh/development/temp/cmdb_session/php-fpm.pid
/usr/sbin/php-fpm --prefix /usr --fpm-config /etc/php-fpm.conf
4.安裝pip
cd {workdir}
wget https://bootstrap.pypa.io/get-pip.pypython get-pip.py(我總覺得上面這句話很重要,這個pip是安裝在python2.7下面的缺虐,一切使用pip安裝的包都是在python2.7下)
測試:
# pip --version
Could not find platform independent libraries
Could not find platform dependent libraries
Consider setting $PYTHONHOME to[:]
ImportError: No module named site
因為在編譯python時指定了--prefix芜壁,所以python home不再是默認(rèn)的/usr/local/,需要在/etc/profile末尾指明一下:
export PYTHONHOME=/usr/local/python2.7
退出保存高氮,使生效:source /etc/profile
# pip --version
pip 9.0.1 from /usr/local/python2.7/lib/python2.7/site-packages (python 2.7)
成功慧妄。
(pip安裝的另一種方式:
pip安裝也可以用yum完成:yum install -y python-pip,但有可能會報錯:No package python-pip available.
可能是在已有的yum源中找不到這個名稱的包纫溃,安裝epel源:
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install -y python-pip
成功腰涧。)
5.centos6.8使用的yum命令是依賴于python2.6的韧掩,我們修改了/usr/bin/python的指向后紊浩,yum命令就不可用了,需要編輯:vi /usr/bin/yum
把第一行#!/usr/bin/python 改成 #!/usr/bin/python2.6
保存疗锐,退出坊谁。yum又可以愉快地玩耍了。
6.pip安裝包時滑臊,官方地址是:http://pypi.python.org口芍。因為各種原因,網(wǎng)速不規(guī)則卡頓雇卷,于是可以修改pip鏡像地址:
或者直接這樣使用命令:
https://www.douban.com/note/302711300/
pip使用技巧:
除了直接用命令:pip install {package_name}以外
1)也可以將要安裝的包鬓椭,先下載到某個目錄{pkg_dir}颠猴,然后指定pip包的安裝來源:pip install --no-index --find-links={pkg_dir}
2)一個python項目中可以創(chuàng)建一個requirements.txt,里面指明項目所需各項的依賴小染,然后用pip安裝:pip -r requirements.txt
3)我們可以多種方式下載:pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com -r requirements.txt
pip install --no-index --find-links={pkg_dir} -r requirements.txt
7.為了解決不同項目翘瓮,依賴不同版本的python;或者兼有依賴同一版本裤翩,但所需要的包不相同的問題资盅,我們需要用virtualenv來管理各個項目所用的python版本及依賴。
我們使用virtualenvwrapper(參考鏈接:https://virtualenvwrapper.readthedocs.io/en/latest/)
pip install virtualenvwrapper
export WORKON_HOME=~/Envs
mkdir -p $WORKON_HOME
source /usr/local/bin/virtualenvwrapper.sh
# mkvirtualenv login
which: no virtualenv in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
ERROR: virtualenvwrapper could not find virtualenv in your path
還是因為我修改過python2.7的安裝路徑踊赠,所用virtualenv找不著了呵扛,把python2.7的bin添加到PATH,修改/etc/profile,在文末添加:
export PATH=$PATH:/usr/local/python2.7/bin
保存退出:source /etc/profile
再次:mkvirtualenv login成功筐带。
切換到login環(huán)境:workon login, 報錯:
Could not find platform independent librariesCould not find platform dependent librariesConsider setting $PYTHONHOME to[:]
ImportError: No module named site
查了半天原來是virtualenv沒有正確指定需要使用的python今穿,在/etc/profile末尾添加:
export VIRTUALENVWRAPPER_PYTHON=$PYTHONHOME/bin/python2.7
virtualenv的命令又可以愉快的玩耍了。
避免每次登陸都要初始化virtualenv的環(huán)境伦籍,增加以下變量在/etc/profile中
export WORKON_HOME=/home/Envs
source $PYTHONHOME/bin/virtualenvwrapper.sh
注意:不要在/etc/profile中添加上面的語句(source $PYTHONHOME/bin/virtualenvwrapper.sh)荣赶,這會導(dǎo)致yum再次失效。
8.用uwsgi啟動一個python django web項目
首先要在對應(yīng)virtualenv下安裝uwsgi鸽斟,很簡單:pip install uwsgi
其次拔创,在項目模塊下定義一個uwsgi.ini文件,文件內(nèi)容如下:
[uwsgi]
http = 127.0.0.1:8000
pidfile2 = /home/login/login_uwsgi.pid
logto2 = /home/login/logs/login_uwsgi.log
logdate = true
log-format = [%(addr)] [%(ctime)] [%(method)] [%(uri)] [%(proto)] [%(status)] [%(msecs)] [%(referer)] [%(uagent)]
daemonize = /home/login/logs/start.log
memory-report = true
master = true
vacuum = true
chdir = /home/login/src
module = wsgi:application
env=BK_ENV=production
cheaper = 4
cheaper-initial = 4
workers = 8
cheaper-algo = busyness
cheaper-overload = 5
cheaper-step = 2
cheaper-busyness-multiplier = 60
buffer-size = 8192
post-buffering = 8192
max-requests = 1024
http:項目監(jiān)聽端口
pidfile2:進(jìn)程啟動生成的pid文件富蓄,進(jìn)程kill后此文件會銷毀
logto2:uwsgi請求日志
daemonize:uwsgi后臺運行
使用啟動腳本start.sh:
#!/bin/bash
LOGIN_HOME=/home/login
LOG_DIR=${LOGIN_HOME}/logs
PID_FILE=${LOGIN_HOME}/login_uwsgi.pid
PYTHON_HOME=/usr/local/python2.7/
VIRTUALENVWRAPPER_PYTHON=$PYTHONHOME/bin/python2.7
WORKON_HOME=/home/Envs
# check repeat start
if [ -f $PID_FILE ]
then
echo "$PID_FILE do exits.."
pid=`cat $PID_FILE`
if [ $pid ]
then
ps aux|awk '{print $2}'|grep $pid && echo "login program pid:[ $pid ] already running ..." && exit 0
echo "proccess pid:[ $pid ] does not exists, prepare to start login process .."
fi
fi
source $PYTHONHOME/bin/virtualenvwrapper.sh
workon login
uwsgi --ini ${LOGIN_HOME}/src/uwsgi.ini
echo "login proccess start success."