我使用的是哪个版本的Python?

如何查看我使用的Python版本?
我正在使用Ubuntu 14.04(Trusty Tahr)。

5另外,查看已安装的Python二进制文件的快速方法是:ls /usr/bin | grep python - Tejas Kale
1@TejasKale 最好运行ls /usr/bin/python*(或者如果你真的想要名字中任何地方都有python的文件,可以运行ls /usr/bin/*python*)。这样,ls仍然会为终端格式化其输出(并且您将获得多列和在Ubuntu中默认的ls别名下,还有颜色显示)。 - Eliah Kagan
9个回答

你可以使用python -V(等等)来显示python命令解析到的Python版本。如果这就是你需要的,那么你已经完成了。但是要查看系统中的每个Python版本需要更多一些。
在Ubuntu中,我们可以使用readlink -f $(which python)来检查解析结果。在14.04默认情况下,这将简单地指向/usr/bin/python2.7
我们可以将其链接起来以显示该版本Python的版本:
$ readlink -f $(which python) | xargs -I % sh -c 'echo -n "%: "; % -V'
/usr/bin/python2.7: Python 2.7.6

但这仅告诉我们当前的python版本。如果我们在Virtualenv(一种常见的Python堆栈管理系统)中,python可能会解析为不同的版本:
$ readlink -f $(which python) | xargs -I % sh -c 'echo -n "%: "; % -V'
/home/oli/venv/bin/python: Python 2.7.4

这是真实的输出。
事实上,您的系统可能隐藏着数百个不同版本的Python,它们可能位于上下文添加的路径上,或者以不同的二进制名称存在(例如python3)。
如果我们假设Python二进制文件总是被称为python<something>并且是一个二进制文件,那么我们可以在整个系统中搜索符合这些条件的文件。
$ sudo find / -type f -executable -iname 'python*' -exec file -i '{}' \; | awk -F: '/x-executable; charset=binary/ {print $1}' | xargs readlink -f | sort -u | xargs -I % sh -c 'echo -n "%: "; % -V'
/home/oli/venv/bin/python: Python 2.7.4
/media/ned/websites/venvold/bin/python: Python 2.7.4
/srv/chroot/precise_i386/usr/bin/python2.7: Python 2.7.3
/srv/chroot/trusty_i386/usr/bin/python2.7: Python 2.7.6
/srv/chroot/trusty_i386/usr/bin/python3.4: Python 3.4.0
/srv/chroot/trusty_i386/usr/bin/python3.4m: Python 3.4.0
/usr/bin/python2.7: Python 2.7.6
/usr/bin/python2.7-dbg: Python 2.7.6
/usr/bin/python3.4: Python 3.4.0
/usr/bin/python3.4dm: Python 3.4.0
/usr/bin/python3.4m: Python 3.4.0
/web/venvold/bin/python: Python 2.7.4

这显然是一个相当可怕的命令,但这又是真实的输出,看起来它似乎做了一份相当彻底的工作。

我收到了以下信息,但不确定它的含义:readlink: extra operand '/usr/bin/python2.7' 请尝试输入 'readlink --help' 以获取更多信息。 - hello_there_andy
我以为 python -v 会返回版本信息,并以 root 用户身份执行了该命令。它打印出了一长串的内容,但在顶部显示了 installing zipimport hook,现在我似乎陷入了一个程序中,我不知道如何退出,更不用说卸载了?? 你能帮我解决这个问题吗? - oldboy
3@Anthony,关于版本的-V标志是区分大小写的。python -v会将您放入一个打开了详细信息的Python控制台中。按下Control + D退出。或者输入exit()并按回车键退出。 - Oli
@hello_there_andy 我猜你在复制命令时打错了一个字。 - wjandrea
我使用这个命令错过了几个虚拟环境。不过,我不确定为什么会这样。 - Ciske
嗨@Oli,谢谢你详细的回答,很有道理。关于这个问题,我还有几个疑问,因为当我运行它时,它没有识别出所有的版本。例如,如果我运行"python --version"或者"python3 --version",无论哪种情况下我都会得到"Python 3.7.6",但是当我运行你的命令时,除了3.7.6之外,我得到了各种各样的版本,比如3.6.9文件、3.9.13以及旧版本的3.5.2,但是没有3.7.6。另外,我运行"which python"和"which python3"来查看它们的来源,似乎是从我的anaconda3安装中获取的:/home/user/anaconda3/bin/python3有什么建议吗? - Angelo
@Angelo echo $PATH应该能告诉你具体内容,但是我无法解释为什么。我对conda不太熟悉。可能在~/.bashrc或其他地方有自动设置路径的内容。 - Oli

在终端中输入以下内容(Ctrl+Alt+T):
python -V

或者

python --version

你可以在终端中输入命令,然后加上--help来查找许多命令的选项/参数列表。
例子:
python --help

大多数CLI还提供了手册/页码,可以通过man <command>(例如:man python)来显示。

man python中:

COMMAND LINE OPTIONS
        -V ,  --version
              Prints the Python version number of the executable and exits.

很多机器上也安装了python3,所以你可以这样做:
python3 --version

找出你正在运行的Python 3.x版本。

2值得注意的是,正如@Florian Diesch所暗示的那样,您可能有多个版本的"python"。默认的 "python" 调用指向一个安装了 python 2.7 的版本,尽管 ubuntu 14.04 也附带了 python 3.0。 - Mitch

python --version

python2 --version

显示Python 2.x的版本。
python3 --version

安装的Python 3.x版本

如果你想在Bash中查看所有可用的Python版本作为命令,运行compgen -c python。例如:
$ compgen -c python | sort -u
python
python2
python2.7
python3
python3.4
python3.4m
python3m

如果您想获取以上每个版本的信息:
compgen -c python | sort -u | grep -v -- '-config$' | while read -r p; do
    printf "%-14s  " "$p"
    "$p" --version
done

python         Python 2.7.6
python2        Python 2.7.6
python2.7      Python 2.7.6
python3        Python 3.4.3
python3.4      Python 3.4.3
python3.4m     Python 3.4.3
python3m       Python 3.4.3

注意事项:

这会忽略别名。例如,如果我有alias python=python3,上面的命令仍然会显示python的版本为2.7。要包括别名,你可以使用eval(尽管这可能不安全):
eval "$p --version"

我使用grep -v过滤掉不支持--version标志的python*-config程序。例如:
$ python3-config --version
Usage: /usr/bin/python3-config --prefix|--exec-prefix|--includes|--libs|--cflags|--ldflags|--extension-suffix|--help|--abiflags|--configdir

这应该是最佳答案,我猜。 - Solomon Vimal
这在zsh下似乎不起作用。我猜compgen是特定于bash的?或者至少,在zsh中也存在,但是compgen -c python | wc -l对我来说报告了超过6000个匹配项,使其变得相当无用。 - bluenote10
@bluenote10 是特定于Bash的,没错。我进行了编辑以澄清。在我的Zsh中甚至不存在compgen命令。 - wjandrea

当你在终端中运行python时,它会产生如下输出:
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

看第一行 - Python 2.7.6
还要运行python3。我有3.4.1。
Python 3.4.1 (default, Jul 31 2014, 12:46:17) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

然而,这并不会显示所有的版本。如果你有2个或更多的Python 3.X.X版本,你只能看到最新的一个。
在14.04上,默认安装了2.7.6和3.4.0版本。正如你所见,我已经升级到了3.4.1版本。我知道我仍然有3.4.0版本,因为当我进入/usr/bin目录时,我可以看到python3.4,并且如果我在命令行中运行/usr/bin/python3.4,我会得到3.4.0版本,而运行/usr/local/bin/python3.4则会给我3.4.1版本。
我的代词是他/他。

如果你安装了两个或更多的Python 3.X.x版本,你只会看到最新的那个。它不是显示在PATH环境变量中首先列出的包含目录的版本吗?为什么运行python3总是运行已安装的最高(子)版本的Python3呢?实际上,它不是显示/usr/bin/python3符号链接指向的版本吗?这个版本未必是最新的。 - Eliah Kagan
@Eliah 不清楚,但有些程序从那里获取,而其他程序则从/usr/bin获取... - Tim
2嗯,说到实际运行Python程序,根据它们的运行方式不同,hashbang行可能被用来确定哪个Python作为解释器(详细信息;还要注意hashbang行中使用env以找到系统首选的解释器,这在Python脚本中很常见)。我不确定这是否是你所指的一些程序和其他程序之间的差异。 - Eliah Kagan
不,一个用户说空闲运行在3.4.0版本上,而命令行则是在3.4.1版本上。 - Tim

你还可以使用标准库中的platform模块从代码本身检查Python版本。有两个函数:platform.python_version()(返回字符串)和platform.python_version_tuple()(返回元组)。脚本:
import platform

print(platform.python_version())
print(platform.python_version_tuple())

运行中:

$ python test.py 
3.4.1
('3', '4', '1')
$ python2.7 test.py 
2.7.8
('2', '7', '8')

4我认为使用sys.versionsys.version_info更为常见。 - Matt Nordhoff

轻松地,打开终端并执行以下操作:
输入
python

验证您的2.x版本 在我的情况下,它将显示为:
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.

对于3.x版本,请写下以下内容:
python3

在我的情况下,它看起来是这样的:
Python 3.4.0 (default, Apr 11 2014, 13:05:11) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.

无论哪种情况,要退出Python shell,请输入以下命令:
 exit()

  • 在shell终端中

    $ which -a python 列出所有的 python

    $ which -a python2.7 列出所有的 python2.7

    $ /usr/bin/python -V 提供关于 /usr/bin/python 版本的信息。

  • 在python脚本中检查

以下是在ipython shell中的示例:

In [1]: import sys

In [2]: sys.version
2.7.11 |Anaconda 2.5.0 (64-bit)| (default, Dec  6 2015, 18:08:32) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]

In [3]: sys.version_info
sys.version_info(major=2, minor=7, micro=11, releaselevel='final', serial=0)

In [4]: sys.version_info >= (2,7)
Out[4]: True

In [5]: sys.version_info >= (3,)
Out[5]: False

我以为python -v会返回版本信息,以root身份执行了这个命令。它打印出了一长串内容,在顶部显示了installing zipimport hook,现在我好像陷入了一个我完全不知道如何退出,更别说卸载的程序中。你能帮我解决这个问题吗? - oldboy
1@oldboy 希望你已经恢复了一些,小v python -v 意味着以冗长模式运行交互式解释器,会输出大量详细信息。大V python -V 则是获取版本号。退出解释器很简单且一致。可以使用 Ctrl-ZCtrl-DCtrl-Breakexit()quit()sys.exit()。好吧,事实上并不简单且一致。 - Bob Stein

对于bash脚本来识别要使用的python命令:
#!/usr/bin/env bash

usage() {
    echo "Put your help/usage explanation here"
    exit 1
}

get_python_version_to_use() {
    if python3 --version 2>&1 | grep -q "Python 3" ; then 
        echo "python3"
    elif python --version 2>&1 | grep -q "Python 3"; then
        echo "python"
    elif python --version 2>&1 | grep -q "Python 2" ; then 
        echo "python"
    else 
        echo "Error: Python not found";
        usage
    fi
}

PYTHON_COMMAND=$(get_python_version_to_use)
echo $PYTHON_COMMAND

现在你可以在bash shell中使用它来运行你的脚本了。
PYTHON_COMMAND=$(get_python_version_to_use)

$PYTHON_COMMAND my_script.py

它将根据您的机器上安装的情况使用python3或python2(优先选择python3)