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



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

577   17  

17 ответов:

эта информация доступна в разделе sys.версия строка 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, etc) и даже releaselevel (='alpha','final' и т. д.) к кортежу, как вам нравится. Однако обратите внимание, что почти всегда лучше "утка" проверить, есть ли определенная функция, а если нет, обходной путь (или спасение). Иногда функции уходят в более новых версиях, заменяясь другими.

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

python -V

это задокументировано в 'MAN python'.

мне нравится sys.hexversion для таких вещей.

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

>>> 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!"
>>>

использовать platform ' s python_version из stdlib:

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

поставить что-то вроде:

#!/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)

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

просто введите 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.
>>> 
import sys
sys.version.split(' ')[0]

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

как сказал Сет, основной скрипт может проверить 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

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

import six

if six.PY2:
  # this is python2.x
else:
  # six.PY3
  # this is python3.x

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

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

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

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

и

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

несколько ответов уже подсказали, как запрос текущая версия 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")

просто для удовольствия, ниже приведен способ сделать это на 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")

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

Python 2.4.3 (#1, Jun 11 2009, 14:09:37)

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

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

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.

Comments

    Ничего не найдено.