簡體   English   中英

在不破壞 yum 的情況下升級 python

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM