Як перевірити, у якій версії Python працює мій сценарій?


1183

Як я можу перевірити, яка версія інтерпретатора Python інтерпретує мій сценарій?


1
Поточний потік стосується перевірки версії python з програми / сценарію python. Якщо ви хочете перевірити версію інтерпретатора python, встановлену на вашій машині, з командного рядка, то зверніться до наступного повідомлення - Яку версію Python я встановив?
RBT

1
ось цікавий спосіб розділити python 3 і 2 ...python_version = int(str(range(3))[-2])
Chris_Rands

@RBT: для перевірки однорядного рядка з командного рядка дивіться мою відповідь .
smci

Відповіді:


1377

Ця інформація доступна в 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і т. Д.) І навіть releaselevel (= 'alpha', 'final'і т. Д.) В кордон , як вам подобається. Однак зауважте, що майже завжди краще «качка» перевірити, чи є якась особливість, а якщо ні, то вирішуйте (чи виручайте). Іноді функції відходять у нових версіях, замінюючись іншими.


39
це насправді синтаксис для друку. не для перевірки версії. Я використовую це у своїх сценаріях python 2 та 3:PY3 = sys.version_info[0] == 3
gcb

5
PY2 = sys.version_info [0] == 2 PY3 = sys.version_info [0] == 3
xiaoweiz

25
Ви також можете отримати доступ до деяких полів у sys.version_infoякості властивостей, тому це PY3 = sys.version_info.major == 3може бути трохи привабливішим.
krs013

1
Примітка: sys.hexversion порівнюється з 0x020502F0, див. Docs.python.org/2/library/sys.html#sys.hexversion
Ehrlich

1
@gcb ваш фрагмент коду буде порушений, коли трапиться Python 4. Ви повинні робити if sys.version_info >= (3,). Порівнювати пітонічне порівняння кортежів різного розміру, і це зробить правильно.
Борис

374

З командного рядка (відзначте велику літеру "V"):

python -V

Це задокументовано у "man python".


13
Прописна V - версія, а не малі
Rogue

96

Мені подобаються такі sys.hexversionречі.

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

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

Це чудова функція версії, яку я не бачив, і трохи простіша у використанні (принаймні для мене), ніж звичайна версія ...
Wayne Werner

6
@sorin: чи можете ви пояснити, як це краще, ніж, наприклад, відповідь Сет? Оскільки ви заявляєте, що це найкраще, мені цікаво.
0xC0000022L

3
@ 0xC0000022L Ви коли-небудь замислювалися про те, як ви зможете порівняти текст з кортежу? Як "final" порівнюється з бета-версією, rc або будь-яким іншим. Натомість, якщо у вас є числове значення, ви завжди зможете вказати точну версію.
sorin

1
@sorin: ум, це зовсім не має значення, чи не так? Якщо порівнювати з , здається , не впливає на порівняння і не передбачається. Мабуть, нарізка не потрібна, коли я порівнюю "найзначніші" частини кортежу. Це, мабуть, так поводиться, і саме про це було моє питання. Я не кажу, що це рішення не має своїх достоїнств, мені просто цікаво, чому це найкраще - тобто те, що мені не вистачає. (2,6,4)'final'
0xC0000022L

11
Рівень випуску визначається як "альфа", "бета", "кандидат" або "остаточний", який також порівнюється правильно ...
Фредрік

65

Ваша найкраща ставка - це, мабуть, щось подібне:

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

3
Чому звичайний виняток, а не ImportError? : P
смертельний

4
@deadly - ImportError не застане SyntaxErrors, який буде викинутий, якщо ви спробуєте використати новий синтаксис у старому пітоні, наприклад, намагаючись використовувати ярлик умовно в попередньому 2.5.
Сет

except Exceptionзанадто широкий. Чи не було б краще використовувати конкретні винятки, які ви очікуєте?
Парадокс Фермі

1
@Fermiparadox - Широка припущення обмежує припущення. except Exception:Лінія сама по собі вже передбачає сучасну (2.x +) пітон. Можливо, якийсь майбутній пітон переставить імена виключень якимось відсталим і несумісним способом? (Напевно, ні, але хто знає, як буде виглядати пітон через 20 років, коли у всіх у нас є імплантати очного яблука для очного яблука? Код триває довго.)
Сет,

65

Використовуйте platform'spython_version від stdlib:

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

5
Для функції друку краще в дужках думати про сумісність. Якщо хтось використовує зразок у версії 3, синтаксична помилка буде там чекати.
Алекс Чіанг

47

Покладіть щось на кшталт:

#!/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, ніж цільові, не зможуть навіть завантажити сценарій, тому не вдасться отримати достатньо далеко, щоб повідомити про цю помилку. Як вирішення, ви можете запустити вищезазначене у сценарії, який імпортує скрипт із більш сучасним кодом.


6
Це невірно (або, принаймні, неповно), тому що старі перекладачі заграють нові конструкції мови, такі як x if Pred() else y. Вони загинуть під час фази "лексингу" і ніколи не матимуть шансу реально стратити exit(1) . Відповідь Сет правильна в інкапсуляції нових мовних особливостей в інші файли.
Марк Рушакофф

2
@MarkRushakoff: ваш коментар заплутаний. Який аспект цієї відповіді невірний? Відсутня elseгілка або для чого <використовується а version_info? AFAIK Python прокладає пропущені значення в кортежах, і все це повинно бути дійсним до 2,6, ні? Тому відповідь Сет використовує нарізку (надлишково), поки ця не робить, і це робить ваш коментар ще більш заплутаним.
0xC0000022L

5
Я думаю, що говорить @MarkRushakoff те, що якщо у вас це є у верхній частині файлу, і нова мовна функція в іншому місці того ж файлу, стара версія python загине при завантаженні файлу, перш ніж він запустить будь-який з нього, тому помилка не відображатиметься По суті, ви повинні поставити вище (або інший чек) у верхній частині файлу, а потім імпортувати код, який вимагає нової версії python з окремих файлів.
rjmunro

1
Так, що @rjmunro сказав :)
Марк Rushakoff

25

Ось коротка версія командного рядка, яка виходить відразу (зручна для сценаріїв та автоматизованого виконання):

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)

1
@vigilancer Ви маєте рацію, на момент написання це було ще не так актуально, але я зараз оновив його для Python 3 :)
Wolph

Приємно, це вирішує мою проблему, коли я отримував номер версії, захоплюючи вихід python2 --versionі python3 --versionвід PHP. Хоча я отримав останній без проблем через passthru(), перший надрукував би лише на екран, але ніколи не був би захоплений, навіть коли він буде переспрямований у файл ...
Tox

1
@tox Ви можете сказати print() написати у файл, якщо це зручніше.
Вольф

У моєму випадку це було б так само, як я вже перенаправляю passthru()вихід у файл. Ваше рішення робить саме те, що мені потрібно. :)
Tox

14

З sixмодулем ви можете це зробити:

import six

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

8
import sys
sys.version.split(' ')[0]

sys.version дає вам те, що ви хочете, просто виберіть перше число :)


5

Найпростіший спосіб

Просто введіть 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.
>>> 

23
"Найпростіший спосіб" ... зробити щось інше, ніж те, про що просили.
Люк

4

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

2

Кілька відповідей уже підказують, як запитувати поточну версію пітона. Щоб програмно перевірити вимоги до версії, я б скористався одним із наступних двох методів:

# 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")

2

Нижче наведено спосіб зробити це на 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")

2

Перевірте версію Python: python -Vабо python --versionабоapt-cache policy python

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


3
Та сама відповідь була вже розміщена. і, Питання не в тому, як я можу перевірити, яку версію python я встановив? але "Як перевірити версію в своєму сценарії".
Стенлі Коу

2

Якщо ви хочете виявити pre-Python 3 і не хочете нічого імпортувати ...

... ви можете (ab) використовувати список розуміння списку, визначаючи зміни та робити це в одному виразі :

is_python_3_or_above = (lambda x: [x for x in [False]] and None or x)(True)

2

Щоб перевірити версію 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'

2
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

Для Python 2.7 ми повинні використовувати print("sys.version: {}".format(version)).
Марко

@Marco, правильно. Форматування рядків проводиться для v 3+ з аргументами ключових слів. може бути зроблено як друк ( '[{}, {}, {}]' формат (1,2,3).) для Python 2.7 вих: stackoverflow.com/questions/517355/string-formatting-in-python
Отці

1

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.


Це щось на зразок підкласу namedtupleта порівнювати його з кортежем, безумовно, працює. Щоб отримати повну рівність, вам потрібен п'ятиелементний вклад: мажор, мінор, мікро, реліз (рівневий) і серійний.
Михайло Єдошин

0

Ще простіший найпростіший спосіб:

У Spyder запустіть нову консоль IPython, а потім запустіть будь-який із існуючих сценаріїв.

Тепер версію можна побачити на першому виході, надрукованому у вікні консолі:

"Python 3.7.3 (за замовчуванням, 24 квітня 2019, 15:29:51) ..."

введіть тут опис зображення


0

Щоб перевірити з командного рядка, в одній команді, але включайте головну, мінорну, мікроверсію, випускний рівень та серійний :

> 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 ++ тощо. Корисний для ведення журналів, копіювання, усунення несправностей, звітування про помилки тощо .


-1

Якщо ви працюєте над Linux, просто дайте командний python вихід буде таким

Python 2.4.3 (№1, 11 червня 2009, 14:09:37)

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

Введіть "довідка", "авторське право", "кредити" або "ліцензія" для отримання додаткової інформації.


5
Я хочу, щоб мій скрипт python міг отримати версію python, яка його інтерпретує. Правильна відповідь прийнята.
перевізник

Не допомагає отримати Pythonверсію в сценарії, також подібна відповідь, вже розміщена раніше: stackoverflow.com/a/35294211/950762
Akif
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.