ฉันจะตรวจสอบว่า Python Interpreter เวอร์ชันใดตีความสคริปต์ของฉันได้อย่างไร
python_version = int(str(range(3))[-2])
ฉันจะตรวจสอบว่า Python Interpreter เวอร์ชันใดตีความสคริปต์ของฉันได้อย่างไร
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'
ฯลฯ ) เพื่อ tuple ตามที่คุณต้องการ อย่างไรก็ตามโปรดทราบว่าเป็นการดีกว่าที่จะ "เป็ด" ตรวจสอบว่ามีคุณลักษณะบางอย่างอยู่หรือไม่หากไม่สามารถแก้ปัญหาได้ (หรือประกันตัวออก) บางครั้งคุณสมบัติจะหายไปในรุ่นที่ใหม่กว่าถูกแทนที่ด้วยคุณสมบัติอื่น
PY3 = sys.version_info[0] == 3
sys.version_info
ฐานะคุณสมบัติได้ดังนั้นจึงPY3 = sys.version_info.major == 3
อาจน่าสนใจกว่านี้เล็กน้อย
if sys.version_info >= (3,)
คุณควรจะทำ มันเป็น pythonic ทั้งหมดเพื่อเปรียบเทียบสิ่งอันดับขนาดต่างกันและมันจะทำสิ่งที่ถูกต้อง
จากบรรทัดคำสั่ง (หมายเหตุทุน 'V'):
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
(2,6,4)
สิ่งที่'final'
ดูเหมือนจะไม่ส่งผลกระทบต่อการเปรียบเทียบและไม่ควรทำ เห็นได้ชัดว่าไม่จำเป็นต้องมีการแบ่งส่วนเมื่อฉันเปรียบเทียบส่วน "สำคัญที่สุด" ของ tuple นี่น่าจะเป็นวิธีที่ได้รับการปฏิบัติและนั่นคือสิ่งที่คำถามของฉันเกี่ยวกับ ฉันไม่ได้กำลังพูดว่าวิธีนี้ไม่มีข้อดี แต่ก็แค่สงสัยว่าทำไมมันถึงดีที่สุด - นั่นคือสิ่งที่ฉันคิดถึง
ทางออกที่ดีที่สุดของคุณน่าจะเป็นเช่นนั้น:
>>> 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 รหัสนี้จะเข้ากันได้กับงูหลามรุ่นเก่า:
>>> 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)
ที่ด้านบนของสคริปต์ของคุณ
โปรดทราบว่าไพ ธ อนรุ่นเก่ากว่าเป้าหมายอาจไม่สามารถโหลดสคริปต์ได้ดังนั้นขึ้นอยู่กับว่ามีอะไรในสคริปต์ของคุณดังนั้นจึงไม่ไกลพอที่จะรายงานข้อผิดพลาดนี้ คุณสามารถเรียกใช้ข้างต้นในสคริปต์ที่นำเข้าสคริปต์ด้วยรหัสที่ทันสมัยกว่า
x if Pred() else y
กับภาษาใหม่สร้างเช่น พวกเขาจะตายในช่วง "lexing" และไม่เคยมีโอกาสที่จะประหารชีวิต จริงexit(1)
ๆ คำตอบของเซทนั้นถูกต้องในการห่อหุ้มฟีเจอร์ภาษาใหม่ในไฟล์อื่น
else
สาขาที่หายไปหรือที่<
ใช้สำหรับversion_info
? AFAIK Python แผ่นรองที่ขาดหายไปในสิ่งอันดับและทั้งหมดนี้ควรจะถูกต้องก่อน 2.6, ไม่? ดังนั้นคำตอบของเซทจึงใช้การแบ่งส่วน (ซ้ำซ้อน) ในขณะที่คำตอบนี้ไม่ได้ทำให้ความคิดเห็นของคุณสับสนมากยิ่งขึ้น
ต่อไปนี้เป็นเวอร์ชัน commandline สั้น ๆ ที่ออกมาทันที (มีประโยชน์สำหรับสคริปต์และการดำเนินการอัตโนมัติ):
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()
ไปยังไฟล์ วิธีการแก้ปัญหาของคุณทำสิ่งที่ฉันต้องการ :)
ด้วย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 ให้สิ่งที่คุณต้องการเพียงแค่เลือกหมายเลขแรก :)
เพียงพิมพ์หลามในเทอร์มินัลของคุณและคุณสามารถดูเวอร์ชันดังต่อไปนี้
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.
>>>
เช่นเดียวกับ Seth กล่าวว่าสคริปต์หลักสามารถตรวจสอบได้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/ซึ่งเป็นสคริปต์สำหรับทดสอบตัวอย่างโค้ดบนไพ ธ อนหลายรุ่นในคราวเดียวเพื่อให้คุณเข้าใจได้ง่ายว่าไพ ธ อนเป็นอย่างไร คุณสมบัติที่เข้ากันได้กับงูหลามรุ่นใด:
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 -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 ให้รันคำสั่งต่อไปนี้ใน command prompt และตรวจสอบผลลัพธ์
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 แต่มันกลับเป็นคลาสพิเศษดังนั้นตัวอย่างทั้งหมดที่ใช้สิ่งอันดับจะไม่ทำงานสำหรับฉันอย่างน้อย นี่คือผลลัพธ์จากคอนโซลหลาม:
>>> 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
และการเปรียบเทียบกับ tuple ได้ผลแน่นอน เพื่อให้ได้ความเท่าเทียมอย่างเต็มที่คุณต้องมีส่วนประกอบห้าส่วน: ส่วนใหญ่, เล็ก, เล็ก, ใหญ่, releaselevel (สตริง) และอนุกรม
วิธีที่ง่ายที่สุดคือ:
ใน Spyder ให้เริ่ม "IPython Console" ใหม่จากนั้นเรียกใช้สคริปต์ที่มีอยู่ของคุณ
ตอนนี้เวอร์ชันสามารถเห็นได้ในเอาต์พุตแรกที่พิมพ์ในหน้าต่างคอนโซล:
"Python 3.7.3 (ค่าเริ่มต้น, 24 เม.ย. 2019, 15:29:51) ... "
ในการตรวจสอบจากบรรทัดคำสั่งในคำสั่งเดียว แต่รวมหลัก, รอง, รุ่นไมโคร, releaselevel และอนุกรม :
> python -c "import sys; print('{}.{}.{}-{}-{}'.format(*sys.version_info))"
3.7.6-final-0
หมายเหตุ: .format()
แทนที่จะเป็นสตริง f หรือ'.'.join()
อนุญาตให้คุณใช้การจัดรูปแบบและตัวคั่นแบบแยกตัวอย่างเช่นเพื่อทำให้เป็นสตริงคำเดียวที่สามารถพิมพ์ได้ ฉันใส่สิ่งนี้ไว้ในสคริปต์ยูทิลิตี้ bash ที่รายงานเวอร์ชันที่สำคัญทั้งหมด: python, numpy, pandas, sklearn, MacOS, xcode, เสียงดังกราว, ชง, conda, อนาคอนด้า, 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