使人抓狂的redis和rediscluster Python驅動包的安裝

本文環境:centos 7,Python3編譯安裝成功,包括pip3,而後須要安裝redis相關的Python3驅動包,本的redis指redis包而非redis數據庫,rediscluster相似。html

先理清楚幾個概念
1,redis包更準確地說是redis-py包,是Python鏈接Redis的驅動文件,若是下載原始文件的話,文件名稱就是redis-py-***.tar.gz
2,rediscluster 包更準確地說是redis-py-cluster包,是Python鏈接Redis Cluster(Redis集羣)的驅動文件
3,rediscluster包依賴於redis包,也就是說rediscluster包鏈接Redis集羣的時候須要依賴redis包
4,這兩個表能夠單獨pip(pip3)安裝,可是安裝rediscluster包的時候redis包會被自動安裝
這是三者之間的關係,其實不太繞,可是名字很是操蛋!!!再加上pip安裝形成的一系列問題,就更操蛋了(可能跟具體的yum源有關,某些yum源就沒有問題)。
這裏EC2是京東提供的服務器,默認使用的京東雲的yum源
node

 

槽點1python

糟糕的命名規則,很早就想吐槽了,爲何Python的MySQL驅動包名是pymysql,Python的SQL Server驅動是pymssql,而Python的redis驅動名稱是redis(不更應該叫pyredis麼)。
而redis這個驅動又不支持集羣的連接,支持集羣鏈接的驅動包名是rediscluster,這樣很容易給人以誤解,爲何不像其餘包同樣加上一個py前綴,pyredis,pyredisclsuter,這樣是否是不會清晰不少。

mysql

槽點2git

pip安裝redis-py-cluster,會自動安裝最新版的redis-py-cluster 2.0.0,同時會自動安裝其依賴的redis(redis-py)驅動包,redis(redis-py)包的版本是最新的3.0.1
問題是,這樣自動安裝完成後,壓根用不了

from rediscluster import StrictRedisCluster會提示錯誤,如上:File "<stdin>", line 1, in <module> ImportError: cannot import name 'StrictRedisCluster' 
而後經過源碼包觀察setup.py中的依賴信息,彷佛也沒有問題,要求redis驅動的版本是3.0.0~3.1.0,也彷佛沒有問題,惋惜就是沒法正常導包。https://github.com/Grokzen/redis-py-cluster/releases這裏是源碼包的地址
github

 

槽點3redis

那麼就卸載redis-cluster-py(沒有卸載redis驅動是一個更大的槽點),從新安裝其餘版本的redis-py-cluster(這裏筆者下載的是redis-py-cluster-1.3.5)sql

經過這裏https://github.com/Grokzen/redis-py-cluster/releases下載較低版本的安裝包,自行安裝,隱約記得以前是1.3.5版本的,這裏下載的是redis-py-cluster 1.3.5
tar xf redis-py-cluster-1.3.5.tar.gz
cd redis-py-cluster-1.3.5
python3 setup.py install
他這裏命名告訴best match:redis 3.0.1,
而後再次嘗試導包from rediscluster import StrictRedisCluster,仍舊會出現以下錯誤。數據庫

>>> from rediscluster import StrictRedisCluster
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/redis-py-cluster-1.3.5/rediscluster/__init__.py", line 7, in <module>
    from .client import StrictRedisCluster, RedisCluster
  File "/usr/local/redis-py-cluster-1.3.5/rediscluster/client.py", line 10, in <module>
    from .connection import (
  File "/usr/local/redis-py-cluster-1.3.5/rediscluster/connection.py", line 11, in <module>
    from .nodemanager import NodeManager
  File "/usr/local/redis-py-cluster-1.3.5/rediscluster/nodemanager.py", line 12, in <module>
    from redis._compat import b, unicode, bytes, long, basestring
ImportError: cannot import name 'b'
>>> 

仍是是redis-py和redis-py-cluster版本不兼容的問題,而後繼續,嘗試卸載redis-3.0.1,從新pip安裝redis最新版(redis-3.3.11),仍舊報錯。
centos

無奈再次卸載redis 3.3.11包,安裝redis 2.10.6包

終於……

 

槽點4

後續進過嘗試,redis-py-cluster-1.3.5的在安裝的時候,仍舊會找到最新的redis版本,結果就是由於redis-py-cluster和redis版本兼容問題,仍舊沒法正常導包
因此想要使用redis-py-cluster-1.3.5,須要提早先安裝好redis 2.10.6,不要讓redis-py-cluster-1.3.5自行安裝一個不兼容的redis(redis-py)包


單獨安裝redis-py-cluster-1.3.5又會自動安裝redis-3*版本的包,結果導包的時候仍是會出錯。

後續通過嘗試,只有redis-py-cluster-1.3.6的在安裝的時候(沒有提早安裝任何redis包),會自動安裝對應的redis版本(redis-2.10.6)

 

總結:
1,結論先行的話就是:不要使用直接pip自動安裝redis,redis-py-cluster這兩個包,也不要直接pip單獨安裝redis-py-cluster,自動安裝的兩個包由於版本衝突沒法正常使用。
2,1)能夠下載指定的redis-py包(redis-py-2.10.6),redis-py-cluster(redis-py-cluster-1.3.5.tar.gz)包,分別手動安裝。
   2)也能夠單獨下載的redis-py-cluster 1.3.6安裝,安裝是能夠成功下載其依賴的redis包的正確的版本。
3,最新版的redis驅動包是不支持redis-py-cluster的,包括使用pip自動安裝(升級)redis,redis-py-cluster,出來以後是沒法導包成功的(from rediscluster import StrictRedisCluster )。
4,對於redis,redis-py-cluster,最好最好最好手動下載對應版本的包,手動安裝。
5,Python的Redis包括Redis集羣鏈接驅動包的命名真的很蛋疼。

 

https://github.com/Grokzen/redis-py-cluster
https://github.com/andymccurdy/redis-py
http://www.javashuo.com/article/p-ngswidvp-dy.htmlhttp://www.javashuo.com/article/p-bjjxavbb-ma.html
https://blog.csdn.net/u010953692/article/details/100062261

相關文章
相關標籤/搜索