zoukankan      html  css  js  c++  java
  • 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 "<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

  • 相关阅读:
    fatal: unable to access ‘https://github.com/Homebrew/brew/‘: Error in the HTTP2 framing layer
    leetcode题目两数和、最大字符串长度、中位数、最长回文子串
    zabbix5.x版本添加自定义监控+263邮件报警
    php过滤特殊字符方法
    js中e相关位置
    少有人走的路-心智成熟的旅程-斯科特·派克
    ios脱壳
    docker 容器开机自启
    Java8 Stream的使用
    Entity Frameworker 的核心 EDM(Entity Data Model)模式
  • 原文地址:https://www.cnblogs.com/lxmhhy/p/6030177.html
Copyright © 2011-2022 走看看