Як я можу перевірити, яка версія інтерпретатора Python інтерпретує мій сценарій?
python_version = int(str(range(3))[-2])
Як я можу перевірити, яка версія інтерпретатора Python інтерпретує мій сценарій?
python_version = int(str(range(3))[-2])
Відповіді:
Ця інформація доступна в 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'
і т. Д.) В кордон , як вам подобається. Однак зауважте, що майже завжди краще «качка» перевірити, чи є якась особливість, а якщо ні, то вирішуйте (чи виручайте). Іноді функції відходять у нових версіях, замінюючись іншими.
PY3 = sys.version_info[0] == 3
sys.version_info
якості властивостей, тому це PY3 = sys.version_info.major == 3
може бути трохи привабливішим.
if sys.version_info >= (3,)
. Порівнювати пітонічне порівняння кортежів різного розміру, і це зробить правильно.
Мені подобаються такі sys.hexversion
речі.
http://docs.python.org/library/sys.html#sys.hexversion
>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True
(2,6,4)
'final'
Ваша найкраща ставка - це, мабуть, щось подібне:
>>> 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!"
>>>
except Exception
занадто широкий. Чи не було б краще використовувати конкретні винятки, які ви очікуєте?
except Exception:
Лінія сама по собі вже передбачає сучасну (2.x +) пітон. Можливо, якийсь майбутній пітон переставить імена виключень якимось відсталим і несумісним способом? (Напевно, ні, але хто знає, як буде виглядати пітон через 20 років, коли у всіх у нас є імплантати очного яблука для очного яблука? Код триває довго.)
Використовуйте platform
'spython_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, ніж цільові, не зможуть навіть завантажити сценарій, тому не вдасться отримати достатньо далеко, щоб повідомити про цю помилку. Як вирішення, ви можете запустити вищезазначене у сценарії, який імпортує скрипт із більш сучасним кодом.
x if Pred() else y
. Вони загинуть під час фази "лексингу" і ніколи не матимуть шансу реально стратити exit(1)
. Відповідь Сет правильна в інкапсуляції нових мовних особливостей в інші файли.
else
гілка або для чого <
використовується а version_info
? AFAIK Python прокладає пропущені значення в кортежах, і все це повинно бути дійсним до 2,6, ні? Тому відповідь Сет використовує нарізку (надлишково), поки ця не робить, і це робить ваш коментар ще більш заплутаним.
Ось коротка версія командного рядка, яка виходить відразу (зручна для сценаріїв та автоматизованого виконання):
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)
python2 --version
і python3 --version
від PHP. Хоча я отримав останній без проблем через passthru()
, перший надрукував би лише на екран, але ніколи не був би захоплений, навіть коли він буде переспрямований у файл ...
print()
написати у файл, якщо це зручніше.
passthru()
вихід у файл. Ваше рішення робить саме те, що мені потрібно. :)
Просто введіть 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
Кілька відповідей уже підказують, як запитувати поточну версію пітона. Щоб програмно перевірити вимоги до версії, я б скористався одним із наступних двох методів:
# 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")
Перевірте версію Python: python -V
або python --version
абоapt-cache policy python
ви також можете запустити, whereis python
щоб побачити, скільки версій встановлено.
... ви можете (ab) використовувати список розуміння списку, визначаючи зміни та робити це в одному виразі :
is_python_3_or_above = (lambda x: [x for x in [False]] and None or x)(True)
Щоб перевірити версію 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'
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
print("sys.version: {}".format(version))
.
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
та порівнювати його з кортежем, безумовно, працює. Щоб отримати повну рівність, вам потрібен п'ятиелементний вклад: мажор, мінор, мікро, реліз (рівневий) і серійний.
Ще простіший найпростіший спосіб:
У Spyder запустіть нову консоль IPython, а потім запустіть будь-який із існуючих сценаріїв.
Тепер версію можна побачити на першому виході, надрукованому у вікні консолі:
"Python 3.7.3 (за замовчуванням, 24 квітня 2019, 15:29:51) ..."
Щоб перевірити з командного рядка, в одній команді, але включайте головну, мінорну, мікроверсію, випускний рівень та серійний :
> 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 ++ тощо. Корисний для ведення журналів, копіювання, усунення несправностей, звітування про помилки тощо .
Якщо ви працюєте над Linux, просто дайте командний python
вихід буде таким
Python 2.4.3 (№1, 11 червня 2009, 14:09:37)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] на linux2
Введіть "довідка", "авторське право", "кредити" або "ліцензія" для отримання додаткової інформації.
Python
версію в сценарії, також подібна відповідь, вже розміщена раніше: stackoverflow.com/a/35294211/950762