同時裝了Python3和Python2,怎麼用pip?

Ubuntu13.04, 系統內同時裝了Python3.3 和 2.7
用sudo apt-get install python-pip
sudo apt-get install python3-pip
分別裝了兩個版本對應的pip

但是現在運行pip install 只能給2.7版安裝庫(好像是因為重名只能調用python-pip),怎麼樣設置才能給3.3版安裝呢?


轉帖-[官解]Windows上Python2和3如何兼容

想學習Python3,但是暫時又離不開Python2。在Windows上如何讓它們共存呢?


目前國內網站經常會讓大家把其中一個python.exe改個名字(嗯,我也這樣講過,在此糾正一下),這樣區分開兩個可執行文件的名字,但是這樣做有一個重大的隱患,就是修改了名字的那個python對應的pip將無法使用。


官方的解法是什麼?


事實上這個問題幾年以前Python社區就給出了官方解決方案,只不過國內一直沒有注意到罷了。


我們在安裝Python3(&>=3.3)時,Python的安裝包實際上在系統中安裝了一個啟動器py.exe,默認放置在文件夾C:Windows下面。這個啟動器允許我們指定使用Python2還是Python3來運行代碼(當然前提是你已經成功安裝了Python2和Python3)。

有關Python2和3的安裝,可以參見Python部落(http://python.freelycode.com)--&>影音學堂--&>《0基礎1小時,Python入門》的第一節。

如果你有一個Python文件叫 hello.py,那麼你可以這樣用Python2運行它

py -2 hello.py

類似的,如果你想用Python3運行它,就這樣

py -3 hello.py

去掉參數 -2/-3


每次運行都要加入參數-2/-3還是比較麻煩,所以py.exe這個啟動器允許你在代碼中加入說明,表明這個文件應該是由python2解釋運行,還是由python3解釋運行。說明的方法是在代碼文件的最開始加入一行

#! python2

或者

#! python3

分別表示該代碼文件使用Python2或者Python3解釋運行。這樣,運行的時候你的命令就可以簡化為

py hello.py

使用pip


當Python2和Python3同時存在於windows上時,它們對應的pip都叫pip.exe,所以不能夠直接使用 pip install 命令來安裝軟體包。而是要使用啟動器py.exe來指定pip的版本。命令如下:

py -2 -m pip install XXXX

-2 還是表示使用 Python2,-m pip 表示運行 pip 模塊,也就是運行pip命令了。如果是為Python3安裝軟體,那麼命令類似的變成

py -3 -m pip install XXXX

#! python2 和 # coding: utf-8 哪個寫在前面?


對於Python2用戶還有另外一個困惑,Python2要在代碼文件頂部增加一行說明,才能夠在代碼中使用中文。如果指明使用的Python版本也需要在文件頂部增加一行,那哪一行應該放在第一行呢?


#! python2 需要放在第一行,編碼說明可以放在第二行。所以文件開頭應該類似於:

#! python2
# coding: utf-8

有了這些技巧,Python2和Python3就可以愉快地在一起玩耍了~

Python標準:PEP 397 -- Python launcher for Windows


## 對於 Linux ##
sudo pip install sth
# 或者明確版本
sudo pip2 install sth
sudo pip3 install sth
sudo python2 -m pip install sth
sudo /path/to/python -m pip install sth

## 對於 Windows NT ##

# 如果僅安裝 python2
pip install sth
# 如果安裝有 python3, 則需要明確 pip 版本
py -2 -m pip install sth
py -3 -m pip install sth

== update, 針對 Linux ==
在 pip, pip2, 或者 pip3 install 失敗時,可以嘗試如下操作:

# 以安裝 youtube-dl 舉例
# proxy_host:proxy_port 為代理地址
export https_proxy=proxy_host:proxy_port
sudo -H pip install --upgrade youtube-dl
# 或 sudo -H pip2 install --upgrade youtube-dl
# 或 sudo -H pip3 install --upgrade youtube-dl
# 或 sudo -H python3.5 -m pip install youtube-dl

將上面的命令改寫為腳本,有哪些好用的bash 技巧(包括不限於快捷鍵、自用小腳本)?

function whereip()
{
argument=${1:-"where"}
case $argument in
where|ip|whereip|show)
curl --silent http://ip.cn 2&>1;;
proxy|world|global)
export HTTPS_PROXY=http://127.0.0.1:8087
export HTTP_PROXY=http://127.0.0.1:8087
export ALL_PROXY=http://127.0.0.1:8087
echo "Setup Proxy Completed."
;;
noproxy|unproxy|local|china)
unset HTTPS_PROXY
unset HTTP_PROXY
unset ALL_PROXY
echo "Cancel Proxy Completed."
;;
*)
echo "whereip show|proxy|noproxy";;
esac
}

寫入 bashrc 或 zshrc,配以代理 8087 (根據實際情況,你可能需要將其修改為正確的地址)

在你 pip 遇到困難的途中,也許這條信息可以給你幫助!


詳見官方文檔

https://docs.python.org/3/installing/

mac自帶py2.7,自己安裝了pip

安裝了python3.4, 已包含pip

更新pip

實測安裝第三方包

看一下site-packages

Done!


python3的用pip3


一步步教你打造Python 和 Python3 並存的環境:
為了回答這個問題,特意跑到一台 CentOS 6.5 上裝了一個 Python3(手頭沒有 Ubuntu 的環境),然後又裝了一個 pip,通過ln創建連接、alias創建別名這些操作,證明Python2 和 Python3 還是可以完美並存的。
題主的問題不在於能不能並存,而在於用默認的 pip install 命令給Python3 安裝這個做法本身就是錯誤的,下面是我的解決方案:

環境上之前已經有了 Python 和 pip,

# python --version:
Python 2.7.9
# pip --version
pip 8.1.1 from /usr/local/lib/python2.7/site-packages (python 2.7)

安裝了 Python3 (路徑 /usr/local/python3/bin/python3)之後,創建一個軟鏈接 /usr/bin/python3,

# ln -s /usr/local/python3/bin/python3 /usr/bin/python3
# which python3
/usr/bin/python3
# ll /usr/bin/python3
lrwxrwxrwx. 1 root root 30 4月 28 20:46 /usr/bin/python3 -&> /usr/local/python3/bin/python3

這樣就可以直接使用 python3 命令了。

# python3 --version
Python 3.5.1

接著我用 Python3 裝了個pip(路徑 /usr/local/python3/bin/pip3)。之前有人說用pip3升級又會變成pip,所以我開始裝的是一個1.5.4版本的。

# which pip3
/usr/bin/which: no pip3 in (/usr/lib/java/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
# ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
# pip3 --version
pip 1.5.4 from /usr/local/python3/lib/python3.5/site-packages/pip-1.5.4-py3.5.egg (python 3.5)

那我現在就開始用兩個pip進行安裝啦,就安裝那個 requests 包吧:

# python
Python 2.7.9 (default, Dec 1 2015, 14:05:26)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
&>&>&> import requests
Traceback (most recent call last):
File "&", line 1, in &
ImportError: No module named requests
&>&>&>

包不存在噢~

# pip install requests
Collecting requests
Downloading requests-2.9.1-py2.py3-none-any.whl (501kB)
100% |████████████████████████████████| 501kB 945kB/s
Installing collected packages: requests
Successfully installed requests-2.9.1

# python
Python 2.7.9 (default, Dec 1 2015, 14:05:26)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
&>&>&> import requests
&>&>&> requests.get("http://zhihu.com")
&
&>&>&>

Python2 下是沒問題的,接下來再看 Python3:

# python3
Python 3.5.1 (default, Apr 28 2016, 20:38:40)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
&>&>&> import requests
Traceback (most recent call last):
File "&", line 1, in &
ImportError: No module named "requests"
&>&>&>

也是不存在的。

# pip3 install requests
Collecting requests
Using cached requests-2.9.1-py2.py3-none-any.whl
Installing collected packages: requests
Successfully installed requests-2.9.1
# python3
Python 3.5.1 (default, Apr 28 2016, 20:38:40)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
&>&>&> import requests
&>&>&> requests.get("http://zhihu.com")
&
&>&>&>

bingo~
好,我再升級一下 pip3:

# pip3 install --upgrade pip
Downloading/unpacking pip from https://pypi.python.org/packages/31/6a/0f19a7edef6c8e5065f4346137cc2a08e22e141942d66af2e1e72d851462/pip-8.1.1-py2.py3-none-any.whl#md5=22db7b6a517a09c29d54a76650f170eb
Downloading pip-8.1.1-py2.py3-none-any.whl (1.2MB): 1.2MB downloaded
Installing collected packages: pip
Found existing installation: pip 1.5.4
Uninstalling pip:
Successfully uninstalled pip
Successfully installed pip
Cleaning up...

# pip3 --version
pip 8.1.1 from /usr/local/python3/lib/python3.5/site-packages (python 3.5)

完美升級,並且可用。

現在再說為什麼題主使用 pip install 想給 Python3 安裝這個做法是錯的:
看我上面執行了兩個 pip --version 命令和 pip3 --version 命令,明確的顯示了他們安裝包的 site-packages 路徑,你默認的 pip 是 Python2 下的,安裝的包當然安裝不到 Python3 下面。我為什麼要在 /usr/bin 下創建一個 pip3 鏈接,因為同一個目錄下,只能存在一個 pip , 已經存在了指向 Python2 的 pip,新來的 pip 就不能再用這個名字,否則覆蓋就造成原來 Python2 的 pip 不可用。
如何解決同名命令的多版本存在的問題呢? 參考我下面的做法:

python3/pip3 帶個數字的命令總覺得不正統,但是不帶數字的 python/pip 已經被 Python2 給佔用了又想保留他們,那我該怎麼辦呢? 這個時候就輪到偉大的 alias 上場了:

# alias pip=/usr/local/python3/bin/pip3
# pip --version
pip 8.1.1 from /usr/local/python3/lib/python3.5/site-packages (python 3.5)

此時 再用 pip install 安裝的庫都將安裝到 Python3 的路徑下,如果想用 Python2 的 pip , 只需要執行一個 unalias pip 就好了:

# unalias pip
# pip --version
pip 8.1.1 from /usr/local/lib/python2.7/site-packages (python 2.7)

同理,可以把這個用到 python 命令上。
alias 命令可以寫到你的shrc環境變數文件里,這樣就不用每次都敲這麼一長串命令了。
(看那個貼官方答案的,每次安裝執行那麼長一坨命令就不頭疼么?)

另外,那篇[官解]里說腳本頭部加上 shebang 行的,個人認為完全沒有必要,為什麼呢?
Linux 裡面,腳本加上 shebang 並賦予可執行許可權,這樣通過 "/路徑/腳本" 的形式就可以執行腳本了,如果腳本沒有賦予可執行許可權時,這種方式就無法執行。而用以下這種方式:
"python /路徑/腳本" 或者 "python3 /路徑/腳本" 無論有沒有賦予腳本許可權,無論有沒有 shebang 行,腳本都是可以執行的,還是這種方式更直接一些。

PS: Linux 下面多認識一下 PATH,用好 ln 、alias ,可以幫你解決好多問題 ,有時 virtualenv 也並不需要。
??乛?乛?? 完美


用 virtualenv 是王道。
另外根據 http://packages.ubuntu.com/zh-cn/quantal/all/python3-pip/filelist 這裡看,python3-pip 裝出來的應該是 pip-3.2 之類。用 dpkg -L python3-pip 看一下命令全路徑。


pip3 install


為什麼不用pyenv?以前用virtualenv,偶然發現還有個pyenv,結合virtualenv一起用,爽到爆


virtualenv 是 lib 級別的隔離,如果需要python解釋器的隔離,可以直接用
yyuu/pyenv · GitHub


提供一個Windows下的解決方案:
先安好的python2的pip,它的默認路徑是C:Python27Scripts

看到沒有,它怕你找不到,自己給自己起了3個名字,隨便你用哪個。

然後安裝python3的pip,它的默認路徑是C:Users***AppDataLocalProgramsPythonPython35-32Scripts

也是3個名字。

然後你把這兩個路徑填加到環境變數中,就可以愉快的用
pip2 install ... (python2)
pip3 install ... (python3)
分別安裝庫了。


兩個版本的Python:

$ python -V
Python 2.7.10

$ python3 -V
Python 3.5.2

可以使用:

$ python -m pip install requests
$ python3 -m pip install requests

或者使用:

$ pip install requests
$ pip3 install requests


python3.3自帶pyvenv不需要vitrualenv了


在終端上使用命令
:~$ which pip
/usr/local/bin/pip
:~$ which pip3
/usr/local/bin/pip3
可以查到pip相關的packages路徑。
用ls查看如下:
~$ ls /usr/local/bin
cheat ipcluster3 ipython __pycache__ pyreverse.bat
django-admin ipcontroller ipython3 pygmentize pytest
django-admin.py ipcontroller3 pip pylint symilar
douban.fm ipengine pip2 pylint.bat symilar.bat
epylint ipengine3 pip2.7 pylint-gui virtualenv
epylint.bat iptest pip3 pylint-gui.bat virtualenv-3.4
ipcluster iptest3 pip3.4 pyreverse

表明可以選擇的pip命令有pip, pip2, pip3 等等。

再查具體的版本:
~$ pip -V
pip 1.5.6 from /usr/lib/python2.7/dist-packages (python 2.7)
~$ pip2 -V
pip 1.5.6 from /usr/lib/python2.7/dist-packages (python 2.7)

pip3 -V
pip 6.0.6 from /usr/local/lib/python3.4/dist-packages/pip-6.0.6-py3.4.egg (python 3.4)

你就知道pip默認相當於pip2,都是為python2服務的;
而pip3是為python3服務的。

所以要給python3安裝庫,要使用命令:
sudo pip3 install XXX


python2與python3共存問題解決

  1. 官網下載兩個安裝包,如:python2.7.13,python3.5.3
  2. 分別安裝如我的目錄:
  3. 檢查path中添加安裝目錄和script目錄(pip目錄),一般安裝版本可以選擇添加環境變數,所以一般不需要手動添加如我的變數為:(安裝時候自動添加的)
    C:Program Filespython27;
    C:Program Filespython27Scripts;
    C:Program FilesPython35;
    C:Program FilesPython35Scripts

4. 這樣的話直接運行python的時候,因為不知道運行哪款python解釋器,所以需要修改python.exe以不同標識。
在C:Program Filespython27目錄下將python.exe複製一份重命名為python2.exe
在Program FilesPython35目錄下將python.exe複製一份重命名為python3.exe(這兩處為什麼要複製重命名請參考步驟5)

(當然如果兩款解釋器已經有一個是python一個是python3或者一個是python一個是python2的話就不用改,因為改名主要作用是區別)
在C:Program Filespython27Scripts目錄下將pip.exe重命名為pip2.exe
在C:Program FilesPython35Scripts目錄下將pip.exe重命名為pip3.exe

5. pip2 list 或者pip3 list查看安裝模塊

如果在這一步報錯的話,一定是第4步中直接重命名python.exe了而不是複製一份重命名,因為pip是依賴於python安裝路徑中的python.exe文件


建議用yyuu/pyenv · GitHub , 這樣可以在不修改系統自帶的python的前提下,安裝任意多個Python版本,而且版本之間是相互隔離的,多版本管理起來很方便。


參考了前面的回答,想到一個其他的解決方法:
我的PC:windows 8 x64
希望實現:
1.用python2.7在命令行使用python和pip;
2.用python3.4在命令行使用python3和pip3
我習慣使用python2.7,命令都是使用的python和pip,這時候裝了python3.4,首先到python3下修改python.exe,pythonw.exe為python3.exe,pythonw3.exe.添加python3.4的路徑和python3.4/Scripts到環境變數里。啟動cmd,輸入python3 -V和pip3 -V。如果pip3 -V出現failed to create process.使用python3 -m pip install --upgrade pip --force-reinstall重新安裝pip,這時就可以使用pip3了


我的話默認python版本是py2


1. 那麼使用pip的時候就是:
python -m pip xxxxxx

2. 那麼很簡單...py3的話就是:
python3 -m pip xxxxxxx


同上,用 virtualenv
pip: www.pip-installer.orgvirtualenv: http://www.virtualenv.orgvirtualenvwrapper: http://virtualenvwrapper.readthedocs.org


我有個笨辦法,但管用
先找出所有pip的位置,一個是python2的,一個是3的
然後命令行中給出相應版本pip的全路徑


Windows 10 系統,安裝了python2.7和python3.6,在 cmd 中 "python" 打開python3.6;"python2" 打開python2.7。在 cmd 中變更到 python 相應版本的安裝路徑,如:cd c:/python27/Scripts,然後回車,接著輸入:pip install xxxxx。python3.6安裝亦然。


推薦閱讀:

Python3中如何得到Unicode碼對應的中文?

TAG:Python | Ubuntu | Python3x |