python版本升级

  python 2.7.11,下载链接  https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz,如下载速度太慢可在豆瓣pypi搜索下载 https://pypi.doubanio.com/simple/

python升级到2.7.11可解决 内置的 socket库的setdefaulttimeout方法和multiprocessing库的manage队列冲突的问题,在2.7.3版本是需要改源码才能解决。问题如下

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/multiprocessing/process.py", line 232, in _bootstrap
    self.run()
  File "/usr/local/lib/python2.7/multiprocessing/process.py", line 88, in run
    self._target(*self._args, **self._kwargs)
  File "agentInstaller.py", line 445, in getInstallInfo
    lock.acquire()
  File "/usr/local/lib/python2.7/multiprocessing/managers.py", line 960, in acquire
    return self._callmethod('acquire', (blocking,))
  File "/usr/local/lib/python2.7/multiprocessing/managers.py", line 729, in _callmethod
    self._connect()
  File "/usr/local/lib/python2.7/multiprocessing/managers.py", line 716, in _connect
    conn = self._Client(self._token.address, authkey=self._authkey)
  File "/usr/local/lib/python2.7/multiprocessing/connection.py", line 149, in Client
    answer_challenge(c, authkey)
  File "/usr/local/lib/python2.7/multiprocessing/connection.py", line 383, in answer_challenge
    message = connection.recv_bytes(256)         # reject large message
IOError: [Errno 11] Resource temporarily unavailable

解决问题可以修改源代码文件 /usr/local/lib/python2.7/multiprocessing/connection.py 

157     def Pipe(duplex=True):
158         '''
159         Returns pair of connection objects at either end of a pipe
160         '''
161         if duplex:
162             s1, s2 = socket.socketpair()
++163           s1.setblocking(True)                                                                                                                                                        
++164           s2.setblocking(True)
165             c1 = _multiprocessing.Connection(os.dup(s1.fileno()))
166             c2 = _multiprocessing.Connection(os.dup(s2.fileno()))
167             s1.close()
168             s2.close()
169         else:
170             fd1, fd2 = os.pipe()
171             c1 = _multiprocessing.Connection(fd1, writable=False)
172             c2 = _multiprocessing.Connection(fd2, readable=False)
173
174         return c1, c2

226     def __init__(self, address, family, backlog=1):
227         self._socket = socket.socket(getattr(socket, family))
228         self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
++229       self._socket.setblocking(True)                                                                                                                                                  
230         self._socket.bind(address)
231         self._socket.listen(backlog)
232         self._address = self._socket.getsockname()
233         self._family = family
234         self._last_accepted = None

243     def accept(self):
244         s, self._last_accepted = self._socket.accept()
++245       s.setblocking(True)                                                                                                                                                             
246         fd = duplicate(s.fileno())
247         conn = _multiprocessing.Connection(fd)
248         s.close()
249         return conn

257 def SocketClient(address):
258     '''
259     Return a connection object connected to the socket given by `address`
260     '''
261     family = address_type(address)
262     s = socket.socket( getattr(socket, family) )
++263   s.setblocking(True)                                                                                                                                                                 
264     t = _init_timeout()

修改 /usr/local/lib/python2.7/test/test_multiprocessing.py

 assert sio.getvalue() == 'foo'
2029
++2030 # Test interaction with socket timeouts - see Issue #6056
++ 2031 #
++ 2032
++ 2033 class TestTimeouts(unittest.TestCase):
++ 2034     @classmethod
++ 2035     def _test_timeout(cls, child, address):
++ 2036         time.sleep(1)
++ 2037         child.send(123)
++ 2038         child.close()
++ 2039         conn = multiprocessing.connection.Client(address)
++ 2040         conn.send(456)
++ 2041         conn.close()
++ 2042
++ 2043     def test_timeout(self):
++ 2044         old_timeout = socket.getdefaulttimeout()
++ 2045         try:
++ 2046             socket.setdefaulttimeout(0.1)
++ 2047             parent, child = multiprocessing.Pipe(duplex=True)
++ 2048             l = multiprocessing.connection.Listener(family='AF_INET')
++ 2049             p = multiprocessing.Process(target=self._test_timeout,
++ 2050                                         args=(child, l.address))
++ 2051             p.start()
++ 2052             child.close()
++ 2053             self.assertEqual(parent.recv(), 123)
++ 2054             parent.close()
++ 2055             conn = l.accept()
++ 2056             self.assertEqual(conn.recv(), 456)
++ 2057             conn.close()
++ 2058             l.close()
++ 2059             p.join(10)
++ 2060         finally:
++ 2061             socket.setdefaulttimeout(old_timeout)
++ 2062
++ 2063
++ 2064 testcases_other = [OtherTest, TestInvalidHandle, TestInitializers,
--2065 #-                   TestStdinBadfiledescriptor]
++ 2066                   TestStdinBadfiledescriptor, TestTimeouts]

升级2.7.11的其他好处就去看官网描述吧。安装过程如下:

curl -k https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz -o python-2.7.11.tgz

yum -y install gcc gcc-c++ autoconf

yum -y install ncurses ncurses-devel

yum -y install mysql-devel

tar xf Python-2.7.11.tgz
cd Python-2.7.11/
./configure
make -j4 && make install

升级完重新打开secureCRT窗口

[root@master ~]# python
Python 2.7.11 (default, Nov  4 2016, 14:13:05) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

安装 pip,下载 get-pip.py

mv /usr/bin/python /usr/bin/python2.6.6
ln -s /usr/local/bin/python /usr/bin/python
vim /usr/bin/yum 修改成 /usr/bin/python2.6.6
python get-pip.py
whereis pip
ln -s /usr/local/bin/pip2.7 /usr/bin/pip

安装readline

yum -y install readline-devel
yum -y install patch 
yum -y  install gcc python-devel zlib-devel openssl-devel libffi-devel

pip install readline

若是使用 easy_install,则需要下载安装 setuptools 安装,下载链接 https://pypi.python.org/pypi/setuptools#downloads,安装过程缺少相关软件则同样下载安装包后上传至服务器安装,如果提示 

MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker")
TypeError: __call__() takes exactly 2 arguments (1 given)

则需要注释掉该行代码,并补充如下代码

# MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker")
MARKER_EXPR = originalTextFor(MARKER_EXPR)("marker")

接着可能会遇到 “缺少 zlib 模块” 的情况,因为我们已经安装过 zlib-devel 模块和 zlib.x86_64 ,则只需要重新在 python 安装包中 make && make install 即可。

安装MySQLdb

pip install MySQL-python

或者源码安装

tar zxf MySQL-python-1.2.3.tar.gz
cd MySQL-python-1.2.3
python setup.py build
python setup.py install

如果出现下面问题

>>> import MySQLdb
/usr/local/lib/python2.7/site-packages/MySQL_python-1.2.3-py2.7-linux-x86_64.egg/_mysql.py:3: UserWarning: Module _mysql was already imported from /usr/local/lib/python2.7/site-packages/MySQL_python-1.2.3-py2.7-linux-x86_64.egg/_mysql.pyc, but /home/opd/tmpFiles/singleExec/MySQL-python-1.2.3 is being added to sys.path
Traceback (most recent call last):
  File "", line 1, in 
  File "MySQLdb/__init__.py", line 19, in 
    import _mysql
  File "build/bdist.linux-x86_64/egg/_mysql.py", line 7, in 
  File "build/bdist.linux-x86_64/egg/_mysql.py", line 6, in __bootstrap__
ImportError: libmysqlclient.so.20: cannot open shared object file: No such file or directory
>>>

解决方法如下

# 根据最后提示,应该是找不着一个交libmysqlclient.so.18的文件,于是到mysql安装目录里找到这个文件并且做一个软连接到/usr/lib
ln -s /usr/local/mysql/lib/libmysqlclient.so.20 /usr/lib64/libmysqlclient.so.20
# 如果是64系统则:
ln -s /usr/local/mysql/lib/libmysqlclient.so.20 /usr/lib64/libmysqlclient.so.20

 

原创文章,转载请备注原文地址 http://www.cnblogs.com/lxmhhy/p/6030177.html

 

转载于:https://www.cnblogs.com/lxmhhy/p/6030177.html

你可能感兴趣的:(python版本升级)