Как мне проверить, какая версия Python использует мой скрипт?

Как я могу проверить, какая версия интерпретатора Python интерпретирует мой скрипт?

30 ответов

Решение

Эта информация доступна в строке sys.version в модуле sys:

>>> import sys

Человек читаемый:

>>> print(sys.version)  # parentheses necessary in python 3.       
2.5.2 (r252:60911, Jul 31 2008, 17:28:52) 
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]

Для дальнейшей обработки:

>>> sys.version_info
(2, 5, 2, 'final', 0)
# or
>>> sys.hexversion
34014192

Чтобы скрипт выполнялся с минимальными требованиями к версии интерпретатора Python, добавьте его в свой код:

assert sys.version_info >= (2, 5)

Это сравнивает основные и второстепенные версии информации. Добавить микро (=0, 1и т. д.) и даже уровень выпуска (='alpha','final'и т. д.) в кортеж, как вам нравится. Тем не менее, обратите внимание, что почти всегда лучше проверять наличие определенной функции и, если нет, обходной путь (или выход из кризиса). Иногда функции уходят в новых версиях, заменяя их другими.

Из командной строки (обратите внимание на заглавную букву 'V'):

python -V

Это задокументировано в "man python".

Использование platform "spython_version из stdlib:

>>> from platform import python_version
>>> print(python_version())
2.7.8

Мне нравится sys.hexversion за такие вещи, как это.

http://docs.python.org/library/sys.html

>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True

Ваша лучшая ставка, вероятно, примерно такая:

>>> import sys
>>> sys.version_info
(2, 6, 4, 'final', 0)
>>> if not sys.version_info[:2] == (2, 6):
...    print "Error, I need python 2.6"
... else:
...    from my_module import twoPointSixCode
>>> 

Кроме того, вы всегда можете заключить импорт в простую попытку, которая должна отлавливать синтаксические ошибки. И, к слову @Heikki, этот код будет совместим с гораздо более старыми версиями python:

>>> try:
...     from my_module import twoPointSixCode
... except Exception: 
...     print "can't import, probably because your python is too old!"
>>>

Положите что-то вроде:

#!/usr/bin/env/python
import sys
if sys.version_info<(2,6,0):
  sys.stderr.write("You need python 2.6 or later to run this script\n")
  exit(1)

в верхней части вашего сценария.

Обратите внимание, что в зависимости от того, что еще есть в вашем скрипте, более старые версии python, чем целевая, могут не иметь возможности даже загрузить скрипт, поэтому не будут достаточно далеко, чтобы сообщить об этой ошибке. В качестве обходного пути вы можете запустить вышеупомянутое в сценарии, который импортирует сценарий с более современным кодом.

Вот короткая версия командной строки, которая выходит сразу (удобно для сценариев и автоматического выполнения):

python -c "print(__import__('sys').version)"

Или только мажор, минор и микро

python -c "print(__import__('sys').version_info[:1])" # (2,)
python -c "print(__import__('sys').version_info[:2])" # (2, 7)
python -c "print(__import__('sys').version_info[:3])" # (2, 7, 6)

С six модуль, вы можете сделать это:

import six

if six.PY2:
  # this is python2.x
else:
  # six.PY3
  # this is python3.x
import sys
sys.version.split(' ')[0]

sys.version дает вам то, что вы хотите, просто выберите первый номер:)

Самый простой способ

Просто введите Python в свой терминал, и вы можете увидеть версию, как показано ниже

desktop:~$ python
Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

Как сказал Сет, главный сценарий может проверить sys.version_info (но учтите, что это не появилось до 2.0, поэтому, если вы хотите поддерживать более старые версии, вам нужно проверить другое свойство версии модуля sys).

Но вам все равно нужно позаботиться о том, чтобы в файле не использовались какие-либо функции языка Python, которые недоступны в более старых версиях Python. Например, это разрешено в Python 2.5 и более поздних версиях:

try:
    pass
except:
    pass
finally:
    pass

но не будет работать в более старых версиях Python, потому что вы можете иметь только, кроме ИЛИ, наконец, сопоставить попытку. Поэтому для совместимости со старыми версиями Python вам нужно написать:

try:
    try:
        pass
    except:
        pass
finally:
    pass

Несколько ответов уже предлагают, как запросить текущую версию Python. Чтобы программно проверить требования к версии, я бы использовал один из следующих двух методов:

# Method 1: (see krawyoti's answer)
import sys
assert(sys.version_info >= (2,6))

# Method 2: 
import platform
from distutils.version import StrictVersion 
assert(StrictVersion(platform.python_version()) >= "2.6")

Проверьте версию Python: python -V или же python --version или же apt-cache policy python

Вы также можете запустить whereis python чтобы увидеть, сколько версий установлено.

Это просто возвращает 2.7, 3.6или же 3.9

      import sys
current_version = ".".join(map(str, sys.version_info[0:2]))

это то, что вам обычно нужно...

Если вы хотите обнаружить pre-Python 3 и не хотите ничего импортировать...

... вы можете (ab) использовать изменения области видимости списка и сделать это в одном выражении:

is_python_3_or_above = (lambda x: [x for x in [False]] and None or x)(True)
from sys import version_info, api_version, version, hexversion

print(f"sys.version: {version}")
print(f"sys.api_version: {api_version}")
print(f"sys.version_info: {version_info}")
print(f"sys.hexversion: {hexversion}")

выход

sys.version: 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]
sys.api_version: 1013
sys.version_info: sys.version_info(major=3, minor=6, micro=5, releaselevel='final', serial=0)
sys.hexversion: 50726384

Просто для удовольствия, вот способ сделать это на CPython 1.0-3.7b2, Pypy, Jython и Micropython. Это скорее любопытство, чем способ сделать это в современном коде. Я написал его как часть http://stromberg.dnsalias.org/~strombrg/pythons/, которая является скриптом для тестирования фрагмента кода на многих версиях Python одновременно, так что вы можете легко понять, что такое Python какие функции совместимы с какими версиями python:

via_platform = 0
check_sys = 0
via_sys_version_info = 0
via_sys_version = 0
test_sys = 0
try:
    import platform
except (ImportError, NameError):
    # We have no platform module - try to get the info via the sys module
    check_sys = 1

if not check_sys:
    if hasattr(platform, "python_version"):
        via_platform = 1
    else:
        check_sys = 1

if check_sys:
    try:
        import sys
        test_sys = 1
    except (ImportError, NameError):
        # just let via_sys_version_info and via_sys_version remain False - we have no sys module
        pass

if test_sys:
    if hasattr(sys, "version_info"):
        via_sys_version_info = 1
    elif hasattr(sys, "version"):
        via_sys_version = 1
    else:
        # just let via_sys remain False
        pass

if via_platform:
    # This gives pretty good info, but is not available in older interpreters.  Also, micropython has a
    # platform module that does not really contain anything.
    print(platform.python_version())
elif via_sys_version_info:
    # This is compatible with some older interpreters, but does not give quite as much info.
    print("%s.%s.%s" % sys.version_info[:3])
elif via_sys_version:
    import string
    # This is compatible with some older interpreters, but does not give quite as much info.
    verbose_version = sys.version
    version_list = string.split(verbose_version)
    print(version_list[0])
else:
    print("unknown")

Изнутри python3:

      from sys import version_info 
python_version = f"{version_info.major}.{version_info.minor}"
print(python_version)

Должен вернуться (или аналогичный):

3,9

sys.version_info похоже не возвращает tuple по состоянию на 3.7. Скорее, он возвращает специальный класс, поэтому все примеры, использующие кортежи, не работают, по крайней мере, для меня. Вот вывод из консоли Python:

>>> import sys
>>> type(sys.version_info)
<class 'sys.version_info'>

Я обнаружил, что с помощью комбинации sys.version_info.major а также sys.version_info.minor кажется достаточно. Например,...

import sys
if sys.version_info.major > 3:
    print('Upgrade to Python 3')
    exit(1)

проверяет, работает ли Python 3. Вы даже можете проверить более конкретные версии с...

import sys
ver = sys.version_info
if ver.major > 2:
    if ver.major == 3 and ver.minor <= 4:
        print('Upgrade to Python 3.5')
        exit(1)

можете проверить, если вы используете хотя бы Python 3.5.

Чтобы увидеть сценарий MSDOS для проверки версии перед запуском интерпретатора Python (чтобы избежать исключений синтаксиса версии Python), см. Решение:

Как я могу проверить версию Python в программе, которая использует новые возможности языка?

а также

Скрипт MS; Проверка версии Python перед запуском модуля Python http://pastebin.com/aAuJ91FQ(скрипт, вероятно, легко конвертировать в другие скрипты ОС).

Чтобы проверить версию Python для команд в Windows, выполните следующие команды в командной строке и проверьте вывод

c:\>python -V
Python 2.7.16

c:\>py -2 -V
Python 2.7.16

c:\>py -3 -V
Python 3.7.3

Также, чтобы увидеть конфигурацию папки для каждой версии Python, выполните следующие команды:

For Python 2,'py -2 -m site'
For Python 3,'py -3 -m site'

если вы хотите проверить версию python хотя бы для условия (например, python 3.9.0):

      import platform
python_version_tuple = list(map(int, platform.python_version_tuple()))

if python_version_tuple >= [3, 9, 0]:
    # Running at least Python 3.9.0
else:
    # Running Python below 3.9.0

Еще более простой способ:

В Spyder запустите новую "Консоль IPython", затем запустите любой из существующих сценариев.

Теперь версию можно увидеть в первом выводе, напечатанном в окне консоли:

"Python 3.7.3 (по умолчанию, 24 апреля 2019 г., 15:29:51)..."

все ответы имеют отличные идеи

другой способplatform.python_version_tuple()

      python3 -c “import platform; print(platform.python_version_tuple())”

(‘3’, ‘6’, ‘8’)

Чтобы проверить из командной строки, в одной единственной команде, но с указанием основной, дополнительной, микроверсии, уровня выпуска и серийного номера, затем вызовите тот же интерпретатор Python (то есть тот же путь), который вы используете для своего скрипта:

> path/to/your/python -c "import sys; print('{}.{}.{}-{}-{}'.format(*sys.version_info))"

3.7.6-final-0

Заметка: .format() вместо f-струн или '.'.join()позволяет использовать произвольное форматирование и символы-разделители, например, чтобы сделать эту строку из одного слова, доступной для поиска. Я помещаю это в служебный сценарий bash, который сообщает все важные версии: python, numpy, pandas, sklearn, MacOS, xcode, clang, brew, conda, anaconda, gcc/g++ и т. Д. Полезно для ведения журнала, репликации, устранения неполадок, отчетов об ошибках и т. Д..

Это почти похоже на проблему XY и стоит испытать рамку. Например, самое важное - не то, какая версия Python установлена, а то, чтобы ваша программа работала со всеми версиями за последние 20 лет или около того. Лично я хочу убедиться, что моя программа Python работает. Так, например, я делаю это:

      #!/usr/bin/env python
# -*- coding: utf-8 -*-

Это первые две строчки в моей программе. Я стараюсь не указывать Python версии 2.7.12 или Python версии 3.5, которые установлены в Ubuntu 16.04 LTS (теперь ESM).

Далее внизу появляется:

      from __future__ import print_function  # Must be first import
from __future__ import with_statement  # Error handling for file opens

Это дает Python 2.7.12 тот же отпечаток с ()скобки, которые использует Python 3.x. Также кое-что для открытия файлов в 2.7 с теми же преимуществами 3.x, которые ускользают от меня сейчас :)

Наконец-то у меня есть:

      
try:
    import tkinter as tk
    import tkinter.ttk as ttk
    import tkinter.font as font
    import tkinter.filedialog as filedialog
    import tkinter.messagebox as messagebox
    import tkinter.simpledialog as simpledialog
    PYTHON_VER = "3"

except ImportError:  # Python 2
    import Tkinter as tk
    import ttk
    import tkFont as font
    import tkFileDialog as filedialog
    import tkMessageBox as messagebox
    import tkSimpleDialog as simpledialog
    PYTHON_VER = "2"

Некоторые команды Python 2 не работают в Python 3 и наоборот. Вышеупомянутое гарантирует, что правильный Tkinter / tkinter импортируется. Также проверка PYTHON_VERв нескольких странных местах позволяет мне кодировать это. Примером может служить эта функция, которую я еще не помню, чтобы тестировать:

          @staticmethod
    def convert_seconds(s):
        """ Convert duration d:hh:mm:ss to seconds
            Make definition static because self isn't changed anywhere
        """
        # Grab segments between : in hh:mm:ss
        if PYTHON_VER == "2":
            seg = map(int, s.split(':'))  # Python 2.x
        else:
            seg = list(map(int, s.split(':')))  # Python 3.x +
        return sum(n * sec for n, sec in zip(seg[::-1], (1, 60, 3600)))

Также я не знаю, разумно это или я просто параноик, но я использую sudo apt installдля всех дополнительных библиотек python и доверьте Canonical тяжелую работу по тестированию. я избегаю PIPкак если бы это была Чума в Python.HTH

Из CMD введите py --version Затем нажмите клавишу Enter, и вы увидите установленную версию python, например Python 3.10.0.

Для Windows: перейдите в командную строку и введите python --version или python -V. Вы получите его версию.

Если вы работаете на Linux, просто дайте команду python вывод будет таким

Python 2.4.3 (#1, 11 июня 2009, 14:09:37)

[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] на linux2

Введите "помощь", "авторское право", "кредиты" или "лицензия" для получения дополнительной информации.

Попытка использования os.popen чтобы прочитать его в переменной:

import os
ver = os.popen('python -V').read().strip()
print(ver)
Другие вопросы по тегам