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 "<stdin>", line 1, in <module> File "MySQLdb/__init__.py", line 19, in <module> import _mysql File "build/bdist.linux-x86_64/egg/_mysql.py", line 7, in <module> 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