Hoe controleer ik welke versie van Python mijn script uitvoert?

Hoe kan ik controleren welke versie van de Python Interpreter mijn script interpreteert?


Antwoord 1, autoriteit 100%

Deze informatie is beschikbaar in de sys.versiontekenreeks in de sys-module:

>>> import sys

Menselijk leesbaar:

>>> 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)]

Gebruik voor verdere verwerking sys.version_infoof sys.hexversion:

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

Om ervoor te zorgen dat een script wordt uitgevoerd met een minimale versievereiste van de Python-interpreter, voegt u dit toe aan uw code:

assert sys.version_info >= (2, 5)

Hiermee wordt informatie over de hoofdversie en de secundaire versie vergeleken. Voeg micro (=0, 1, etc) en zelfs releaselevel (='alpha','final'toe , etc) naar de tuple zoals je wilt. Merk echter op dat het bijna altijd beter is om te “duiken” om te controleren of een bepaalde functie aanwezig is, en zo niet, een tijdelijke oplossing te zoeken (of te redden). Soms verdwijnen functies in nieuwere releases en worden ze vervangen door andere.


Antwoord 2, autoriteit 27%

Vanaf de opdrachtregel (let op de hoofdletter ‘V’):

python -V

Dit is gedocumenteerd in ‘man python’.

Van IPython-console

!python -V

Antwoord 3, autoriteit 6%

Ik hou van sys.hexversionvoor dit soort dingen.

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

Antwoord 4, autoriteit 5%

Gebruik platform‘s python_versionvan de stdlib:

from platform import python_version
print(python_version())
# 3.9.2

Antwoord 5, autoriteit 5%

Je beste gok is waarschijnlijk zoiets als:

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

Bovendien kunt u uw invoer altijd in een simpele poging verpakken, wat syntaxisfouten zou moeten opvangen. En, naar het punt van @Heikki, deze code zal compatibel zijn met veel oudere versies van python:

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

Antwoord 6, autoriteit 3%

Zet zoiets als:

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

bovenaan je script.

Houd er rekening mee dat, afhankelijk van wat er nog meer in je script staat, oudere versies van Python dan het doel het script misschien niet eens kunnen laden, dus zullen ze niet ver genoeg komen om deze fout te melden. Als tijdelijke oplossing kunt u het bovenstaande uitvoeren in een script dat het script importeert met de modernere code.


Antwoord 7, autoriteit 2%

Hier is een korte commandoregelversie die meteen afsluit (handig voor scripts en geautomatiseerde uitvoering):

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

Of alleen majeur, mineur en micro:

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)

Antwoord 8

Met de module sixkunt u dit doen door:

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

Antwoord 9

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

sys.version geeft je wat je wilt, kies gewoon het eerste nummer 🙂


Antwoord 10

Zoals Seth al zei, kan het hoofdscript sys.version_infocontroleren (maar merk op dat dat pas in 2.0 verscheen, dus als je oudere versies wilt ondersteunen, moet je een andere versie-eigenschap aanvinken van de sys-module).

Maar je moet er nog steeds voor zorgen dat je geen Python-taalfuncties in het bestand gebruikt die niet beschikbaar zijn in oudere Python-versies. Dit is bijvoorbeeld toegestaan in Python 2.5 en hoger:

try:
    pass
except:
    pass
finally:
    pass

maar zal niet werken in oudere Python-versies, omdat je alleen de try zou kunnen hebben, behalve OR. Dus voor compatibiliteit met oudere Python-versies moet je schrijven:

try:
    try:
        pass
    except:
        pass
finally:
    pass

Antwoord 11

De eenvoudigste manier

Typ gewoon python in uw terminal en u kunt de versie zien
als volgt

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.
>>> 

Antwoord 12

Verschillende antwoorden suggereren al hoe u de huidige python-versie opvraagt. Om de versievereisten programmatisch te controleren, zou ik een van de volgende twee methoden gebruiken:

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

Antwoord 13

Voor de lol is het volgende een manier om het te doen op CPython 1.0-3.7b2, Pypy, Jython en Micropython. Dit is meer een curiositeit dan een manier om het in moderne code te doen. Ik schreef het als onderdeel van http://stromberg.dnsalias.org/~strombrg/pythons/, wat een script is voor het testen van een codefragment op veel versies van python tegelijk, zodat je gemakkelijk een idee krijgt van welke python-functies compatibel zijn met welke versies van 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")

Antwoord 14

Als je pre-Python 3 wilt detecteren en niets wilt importeren…

…u kunt (ab)gebruik maken van wijzigingen in het bereik van lijstbegrip en dit doen in een enkele uitdrukking:

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

Antwoord 15

Als u de Python-versie voor opdrachten op Windows wilt verifiëren, voert u de volgende opdrachten uit in een opdrachtprompt en controleert u de uitvoer

c:\>python -V
Python 2.7.16
c:\>py -2 -V
Python 2.7.16
c:\>py -3 -V
Python 3.7.3

Voer ook de volgende opdrachten uit om de mapconfiguratie voor elke Python-versie te zien:

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

Antwoord 16

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

uitvoer

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

Antwoord 17

Controleer de Python-versie: python -Vof python --versionof apt-cache policy python

je kunt ook whereis pythonuitvoeren om te zien hoeveel versies er zijn geïnstalleerd.


Antwoord 18

sys.version_infolijkt geen tuplete retourneren vanaf 3.7. Het retourneert eerder een speciale klasse, dus alle voorbeelden die tupels gebruiken, werken niet, voor mij althans. Hier is de uitvoer van een python-console:

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

Ik heb ontdekt dat het gebruik van een combinatie van sys.version_info.majoren sys.version_info.minorvoldoende lijkt. Bijvoorbeeld…

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

controleert of u Python 3 gebruikt. U kunt zelfs controleren op specifiekere versies met…

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)

kan controleren of u ten minste Python 3.5 gebruikt.


Antwoord 19

De nog eenvoudigere en eenvoudigste manier:

Start in Spyder een nieuwe “IPython-console” en voer vervolgens een van uw bestaande scripts uit.

Nu is de versie te zien in de eerste uitvoer die in het consolevenster is afgedrukt:

“Python 3.7.3 (standaard, 24 april 2019, 15:29:51)…”

voer hier de afbeeldingsbeschrijving in


Antwoord 20

Om vanaf de opdrachtregel te controleren, in één enkele opdracht, maar met hoofd-, ondergeschikte, microversie, releaseniveau en serieel, roep dan dezelfde Python-interpreter op (dwz hetzelfde pad) als u’ opnieuw gebruiken voor uw script:

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

Opmerking: .format()in plaats van f-strings of '.'.join()stelt u in staat willekeurige opmaak- en scheidingstekens te gebruiken, b.v. om dit een greppable string van één woord te maken. Ik plaats dit in een bash-hulpprogrammascript dat alle belangrijke versies rapporteert: python, numpy, pandas, sklearn, MacOS, xcode, clang, brew, conda, anaconda, gcc/g++ enz. Handig voor logging, repliceerbaarheid, probleemoplossing, bugrapportage enz. .


Antwoord 21

Als je met linux werkt, geef je gewoon het commando python, de uitvoer zal zo zijn

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

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

Typ “help”, “copyright”, “credits” of “licentie” voor meer
informatie.


Antwoord 22

Een poging om os.popente gebruiken om het in een variabele te lezen:

import os
ver = os.popen('python -V').read().strip()
print(ver)

Other episodes