[英]Upgrade python without breaking yum
我最近通過從源代碼編譯在 CentOS 機器上安裝了 Python 2.7.3。 Python 2.7.3 安裝在 /opt/python2.7 ,當我安裝它時,我只是將 /usr/bin/python 更改為指向新版本。 這顯然是錯誤的,因為當我這樣做時它打破了 yum。 我會得到以下內容。
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:
No module named yum
Please install a package which provides this module, or
verify that the module is installed correctly.
It's possible that the above module doesn't match the
current version of Python, which is:
2.7.3 (default, May 15 2012, 17:45:42)
[GCC 4.4.4 20100726 (Red Hat 4.4.4-13)]
If you cannot solve this problem yourself, please go to
the yum faq at:
http://yum.baseurl.org/wiki/Faq
我將 /usr/bin/python 更改為指向 python 2.6.6,但現在 2.6.6 是 python 的默認版本。 知道如何解決這個問題嗎?
我寫了一個關於如何在 CentOS 6 和 CentOS 7 上安裝最新版本的 Python 2 和 Python 3 的快速指南。它目前涵蓋 Python 2.7.13 和 Python 3.6.0:
# Start by making sure your system is up-to-date:
yum update
# Compilers and related tools:
yum groupinstall -y "development tools"
# Libraries needed during compilation to enable all features of Python:
yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel expat-devel
# If you are on a clean "minimal" install of CentOS you also need the wget tool:
yum install -y wget
后續步驟取決於您安裝的 Python 版本。
對於 Python 2.7.14:
wget http://python.org/ftp/python/2.7.14/Python-2.7.14.tar.xz
tar xf Python-2.7.14.tar.xz
cd Python-2.7.14
./configure --prefix=/usr/local --enable-unicode=ucs4 --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
make && make altinstall
# Strip the Python 2.7 binary:
strip /usr/local/lib/libpython2.7.so.1.0
對於 Python 3.6.3:
wget http://python.org/ftp/python/3.6.3/Python-3.6.3.tar.xz
tar xf Python-3.6.3.tar.xz
cd Python-3.6.3
./configure --prefix=/usr/local --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
make && make altinstall
# Strip the Python 3.6 binary:
strip /usr/local/lib/libpython3.6m.so.1.0
要安裝 Pip:
# First get the script:
wget https://bootstrap.pypa.io/get-pip.py
# Then execute it using Python 2.7 and/or Python 3.6:
python2.7 get-pip.py
python3.6 get-pip.py
# With pip installed you can now do things like this:
pip2.7 install [packagename]
pip2.7 install --upgrade [packagename]
pip2.7 uninstall [packagename]
您不應該更改 Python 的系統版本,因為它會破壞系統(如您所見)。 只要您保留原始系統版本,安裝其他版本就可以正常工作。 這可以通過在運行 configure 時使用自定義前綴(例如/usr/local
)並在安裝 Python 構建時使用make altinstall
(而不是正常的make install
)來實現。
只要您記得輸入包含版本號的全名(例如“python2.7”或“pip2.7”),擁有多個可用的 Python 版本通常不是什么大問題。 如果您從 virtualenv 中完成所有 Python 工作,則版本控制會為您處理,因此請確保安裝並使用 virtualenv!
vim `which yum`
modify #/usr/bin/python to #/usr/bin/python2.4
將/opt/python2.7/bin
放在/usr/bin
前面的PATH
環境變量中……或者只是習慣鍵入python2.7
。
pythonz 是 pythonbrew 的一個活躍分支,讓這一切變得輕而易舉。 您可以安裝一個版本:
# pythonz install 2.7.3
然后設置一個符號鏈接:
# ln -s /usr/local/pythonz/pythons/CPython-2.7.3/bin/python2.7 /usr/local/bin/python2.7
# python2.7 --version
Python 2.7.3
ln -s /usr/local/bin/python2.7 /usr/bin/python
好吧,對我來說,正在修復的錯誤是當安裝了不同版本的 python 並且 yum 找不到某個 .so 文件並引發異常時。
yum 根據錯誤需要 2.7.5。
which python gives me /usr/bin/python
python --version gives me 2.7.5
我的修復是將 /lib64 附加到 LD_LIBRARY_PATH 環境變量。 相關內容為/lib64/python2.7和/lib64/python3.6。
export LD_LIBRARY_PATH=/lib64:$LD_LIBRARY_PATH
為我修復了安裝多個 python 版本的 yum 錯誤。
Daniel 的答案可能是最理想的答案,因為它不涉及更改操作系統文件。 但是,我發現自己需要一個通過調用usr/bin/python
來調用 python 的 3rd 方程序,但需要 Python 2.7.16,而默認的 Python 是 2.7.5。 這意味着我必須讓usr/bin/python
指向 2.7.16 版本的 Python 版本,這意味着yum
將無法工作。
我最終做的是編輯文件/usr/bin/yum
並替換那里的 shebang 以使用系統默認 Python(在我的情況下,這意味着將#! /usr/bin/python
更改為#! /usr/bin/python2
)。 但是,在那之后運行yum
給了我一個錯誤:
ImportError: No module named urlgrabber.grabber
我通過以與/usr/bin/yum
相同的方式替換/usr/libexec/urlgrabber-ext-down
的 shebang 解決了這個問題。 即, #! /usr/bin/python
#! /usr/bin/python
到#! /usr/bin/python2
#! /usr/bin/python2
。 在那之后yum
工作了。
這是一個黑客,應該小心使用。 正如其他評論中提到的,修改操作系統文件應該只是最后的手段。
相反,我建議更新相關腳本(例如 /usr/bin/yum)中的路徑,以將您之前的 Python 指向為解釋器。
理想情況下,您希望升級 yum 及其相關腳本,以便默認安裝的 Python 支持它們。
如果這是不可能的,以上是完全可行和經過測試的。
改變:
#!/usr/bin/python
到您的舊版本的任何路徑,直到您可以進行上述 yum 改進。
如果您有一台孤立的機器,沒有時間手動升級 rpm,或者無法臨時或永久連接到標准 yum 存儲庫,則無法執行上述操作的情況。
如果你想嘗試 rpm 包,你可以安裝基於最新 Fedora rpms 的二進制包,但重新編譯為 RHEL6/CentOS6/ScientificLinux-6:
http://www.jur-linux.org/download/el-updates/6/
最好的祝福,
弗洛里安·拉羅什
我讀了一篇評論,指出現在可以運行以下命令。 我沒有測試過自己,所以要小心。
$ yum install -y epel-release
$ yum install -y python36
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.