centos5.8升级python2.4.3到python 2.7.8

备忘笔记:

yum -y groupinstall 'Development Tools'
yum -y install openssl-devel* ncurses-devel* zlib*.x86_64
yum -y install bzip2 bzip2-devel bzip2-libs

yum -y install sqlite-devel

下载python 2.7.8的tar.gz文件

./configure --prefix=/usr/local/python && make && make install
rm /usr/bin/python
ln -s /usr/local/python/bin/python2.7 /usr/bin/python

验证 $python -V

解决yum失效的问题

 # vim /usr/bin/yum
 #!/usr/bin/python
 改成
 #!/usr/bin/python2.4

-------------------------------

开始的时候安装的python2.7.3,安装成功后,运行django的时候错误:

ImportError: No module named _sqlite3

按照网上的普遍的解决办法:

yum install sqlite-devel

并且重新安装了python2.7.3,没有用--prefix

但是依然没有解决这个问题,始终找不到python-2.7.3/lib/python2.7/lib-dynload/_sqlite3.so。

个人怀疑是python 2.7.3的版本问题。

于是安装了python2.7.8,依然没有解决这个问题,但是存在python-2.7.8/lib/python2.7/lib-dynload/_sqlite3.so。

验证,import sys    

         print sys.path

看到引用的路径都是/usr/local/lib下的路径,总结出了以下的观点,如果/usr/local/lib下有python的话,系统会自动的使用这个python,而不会使用你--prefix安装到的那个目录的python,虽然你建立了软连接后运行python -V是你想要的结果。

在删除/usr/local/下的所有以前安装的python后,import sqlite3运行正常。

安装setuptools


    setuptools与pip都是python的模块

setuptools源码包: https://pypi.python.org/pypi/setuptools
pip源码包: https://pypi.python.org/pypi/pip#downloads

   先安装setuptools, 进入setuptools的源码根目录下, 执行以下命令进行setuptools模块的安装:

# python setup.py install

   安装完setuptools后, 接着安装pip, 进入pip的源码包根目录下, 执行以下命令进行安装:

# python setup.py build  
# python setup.py install

  安装完pip后. 看看pip都安装在哪里. 执行以下命令:

# whereis pip

   然后再执行 # pip  命令并回车, 如果无法用pip命令, 则可通过创建pip软链接, 执行以下命令:

# ln -s /usr/local/python/bin/pip /usr/bin/pip

   如果不使用pip的软连接,那么请使用pip的路径

# /usr/local/python/bin/pip

   安装tornado

tornado源码包下载:http://www.tornadoweb.org/en/stable/

   进入tornado的源码根目录下, 执行以下命令进行setuptools模块的安装:

# python setup.py build  
# python setup.py install

  安装django

django下载包地址:https://www.djangoproject.com/

   进入django的源码根目录下,执行一下命令进行django安装

# python setup.py build  
# python setup.py install

   安装jinja2和sqlalchemy

pip install jinja2
pip install sqlalchemy

   安装paramiko

pip install paramiko
安装结果:
Installing collected packages: ecdsa, pycrypto, paramiko
  Running setup.py install for pycrypto
Successfully installed ecdsa-0.13 paramiko-1.15.2 pycrypto-2.6.1
如果不使用pip而是使用源码包的方式的话,需要安装pycrypto和paramiko
而且要安装较新版本(遇到到paramiko低版本在python2.7.8中出现的问题,具体什么问题忘了)

   安装xlrd  xlwt(一个读excel一个写excel)

pip install xlwt
pip install xlrd
其中xlwt默认的字符编码是ascii编码,所以要设置成utf-8编码,我的修改方式是在修改xlwt源码中的编码:
在xlwt/Workbook的第55行修改编码方式,按照上面的安装方式Workbook的位置应该为:
/usr/local/python/lib/python2.7/site-packages/xlwt/Workbook.py
然后把
def __init__(self, encoding='ascii', style_compression=0):
修改成
def __init__(self, encoding='utf-8', style_compression=0):
这样就解决了xlwt的编码问题

   安装mysql-python

pip install MySQL-python

   安装Pillow(图形处理,项目用来生成验证码,下面有代码)

pip install Pillow

   mysql数据库的编码设置成utf-8

创建数据库的编码设置
CREATE DATABASE `rmdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

my.conf里面的编码配置
[mysqld]
            datadir=/var/lib/mysql
            socket=/var/lib/mysql/mysql.sock
            default-character-set=utf8
            user=mysql
            symbolic-links=0
        [mysqld_safe]
            log-error=/var/log/mysqld.log
            pid-file=/var/run/mysqld/mysqld.pid
        [client]
            default-character-set=utf8
        [mysql]   
            default-character-set=utf8 
        [server]   
            default-character-set=utf8 
连接数据库的编码设置(tornado例子)
create_engine("mysql://dusername:dpasswd@localhost/dbname?charset=utf8",encoding='utf-8')

   Pillow生成验证码的代码例子(4位)

#!/usr/bin/python
#fileencoding:utf-8
from PIL import ImageDraw,ImageFont,ImageFilter
from PIL import Image 
import random
import math, string
import os
BASE_DIR = os.path.dirname(__file__)
print BASE_DIR
rootDir = BASE_DIR[0:-15]
fontPath = rootDir+"wqy-zenhei.ttc"
FONT_PATH = fontPath

def initChars():
    """
    允许的字符集合,初始集合为数字、大小写字母
    usage: initChars()
    param: None
    return: list
    返回允许的字符集和
    for: picChecker类初始字符集合
    todo: Nothi
    """
    nums = [str(i) for i in range(10)]
    letter = "abcdefghijklmnopqrstuvwxyz"
    lowerCase = [x for x in letter]
    upperCase = [x.upper() for x in lowerCase]
    return (nums + lowerCase + upperCase)

class picChecker():
    """
    图片验证代码:
    1) 用户注册需填写图片验证码,以阻止机器人注册
    2) 图片验证码字符数为 4 位(大小写字母与数字,不区分大小写)。
    用户如果没有填写验证码或没有填写正确的验证码,
    页面友好性提示用户填写(同时程序方面也做相应限制)
    usage: pc = picChecker().createChecker()
    param: 很多,如下
    chars 允许的字符集合,
    类型 list
    默认值 initChars()
    例子 ['1','2','3']
    length 字符串长度
    类型 integer
    默认值 4
    size 图片大小
    类型 tutle
    默认值 (120,30)
    例子 (120,30)
    fontsize 字体大小
    类型 integer
    默认值 25
    begin 字符其实位置,即左上角位置
    类型 tutle
    默认值 (5,-2)
    outputType 输出类型
    类型 string
    默认值 GIF
    可选值 GIF JPEG TIFF PNG
    mode 图片模式
    类型 string
    可选值 RGB L (还有其他模式,但只推荐这2种)
    默认值 RGB
    backgroundColor 背景色
    foregroundColor 前景色
    当mode=RGB时,backgroundColor,foregroundColor为tutle类型
    取值为(integer,integer,integer)
    表示RGB颜色值
    当mode=L时,backgroundColor,foregroundColor为数字,表示黑白模式
    取值为0-255
    表示灰度
    fonttype 字体路径
    类型 string
    默认值 "simsum.ttc"
    jamNum 干扰线条数
    类型 (int1,int1)
    int1 干扰线条数下限,包含
    int2 干扰线条数上线,包含
    pointBorder 散点噪音
    构造方法:对每个像素点使用随机函数确定是否在该像素上画散点噪音
    类型 (int1,int2)
    int1越大 散点越多
    int2越大 散点越少
    return: [picCheckerStr,pic]
    picCheckerStr: 表示返回图片中对应的字符串,可用于session验证以及其他用途
    pic : 返回的图片,类型为Image
    for :
    todo : Nothing
    """
    def __init__(self, chars = initChars(),
            size = (120, 35), fontsize = 25,
            begin = (5, -2), outputType = 'GIF',
            mode = 'RGB', backgroundColor = (255, 255, 255),
            foregroundColor = (0, 0, 255),
            fonttype = FONT_PATH, length = 4, jamNum = (1, 2),
            pointBorder = (40, 39)
            ):
        self.chars = chars
        self.size = size
        self.begin = begin
        self.length = length
        self.outputType = outputType
        self.fontsize = fontsize
        self.mode = mode
        self.backgroundColor = backgroundColor
        self.foregroundColor = foregroundColor
        self.jamNum = jamNum
        self.pointBorder = pointBorder
        self.fonttype = fonttype
        #self.font = ImageFont.truetype(self.fonttype, self.fontsize)
        self.font = ImageFont.truetype(FONT_PATH, self.fontsize)


    def createPoints(self, draw):
        """
        usage: 创建散点噪音
        para: draw 表示画笔
        return: None
        for:
        todo:
        """
        for x in range(self.size[0]):
            for y in range(self.size[1]):
                flag = random.randint(0, self.pointBorder[0])
                if flag > self.pointBorder[1]:
                    draw.point((x, y), fill = (0, 0, 0))
                del flag

    def createJam(self, draw):
        """
        usage: 创建干扰线
        para: draw 表示画笔
        return: None
        for:
        todo:
        """
        lineNum = random.randint(self.jamNum[0], self.jamNum[1])
        for i in range(lineNum):
            begin = (random.randint(0, self.size[0]),
                    random.randint(0, self.size[1])
                    )
            end = (random.randint(0, self.size[0]),
                    random.randint(0, self.size[1])
                    )
            draw.line([begin, end], fill = (0, 0, 0))


    def getPicString(self):
        """
        usage: getPicString()
        return: string
        for : 生成给定长度的随机字符串
        todo: Nothing
        """
        length = self.length
        chars = self.chars
        selectedChars = random.sample(chars, length)
        charsToStr = string.join(selectedChars, '')
        return charsToStr

    def createChecker(self):
        """
        usage: createChecker()
        return: [str,pic]
        str:对应的字符串
        pic:对应的图片
        for:
        todo:
        """
        randStr = self.getPicString()
        randStr1 = string.join([i + " " for i in randStr], '')
        im = Image.new(self.mode, self.size, self.backgroundColor)
        draw = ImageDraw.Draw(im)
        draw.text(self.begin, randStr1, font = self.font,
               fill = self.foregroundColor )
        self.createJam(draw)
        self.createPoints(draw)
        para = [1 - float(random.randint(1, 2))/100,
               0,
               0,
               0,
               1 - float(random.randint(1, 10))/100,
               float(random.randint(1, 2))/500,
               0.001,
               float(random.randint(1, 2))/500
                ]
        im = im.transform(im.size, Image.PERSPECTIVE, para)
        im = im.filter(ImageFilter.EDGE_ENHANCE_MORE)
        im.save("checker.jpg", self.outputType)
        return ([randStr, im])
if __name__ == "__main__":
    c = picChecker()
    t = c.createChecker()
    print(t)

   自己程序中登录拿验证码呈现在登录页面

@route('getRandomCode', name='')
class GetRandomCodeHandler(BaseHandler):
    def get(self):
        c = picChecker()
        t = c.createChecker()
        sio=StringIO.StringIO()
        #wsServer.col(0).width = 7000
        _id = self.get_secure_cookie("session_id")
        if not _id:
            _id = session_id()
            self.set_secure_cookie("session_id", _id)
            sessionForRandomCodeOld = self.db.query(SessionForRandomCode).filter_by(session_id=_id).first()
            if not sessionForRandomCodeOld:
                localTime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
                sessionForRandomCode = SessionForRandomCode(random_code=t[0],start_date=localTime,session_id=_id)
                self.db.add(sessionForRandomCode)
                self.db.commit()
            else:
                sessionForRandomCodeOld.random_code=t[0]
                self.db.commit()
        else:
            sessionForRandomCodeOld = self.db.query(SessionForRandomCode).filter_by(session_id=_id).first()
            if not sessionForRandomCodeOld:
                localTime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
                sessionForRandomCode = SessionForRandomCode(random_code=t[0],start_date=localTime,session_id=_id)
                self.db.add(sessionForRandomCode)
                self.db.commit()
            else:
                sessionForRandomCodeOld.random_code=t[0]
                self.db.commit()
        t[1].save(sio,'jpeg')
        self.write(sio.getvalue())


你可能感兴趣的:(centos5.8升级python2.4.3到python 2.7.8)