ฉันจะตรวจสอบเวอร์ชันของ Python ที่กำลังเรียกใช้สคริปต์ได้อย่างไร


1184

ฉันจะตรวจสอบว่า Python Interpreter เวอร์ชันใดตีความสคริปต์ของฉันได้อย่างไร


1
เธรดปัจจุบันเกี่ยวข้องกับการตรวจสอบเวอร์ชันของไพ ธ อนจากโปรแกรม / สคริปต์ของไพ ธ อน ในกรณีที่คุณต้องการตรวจสอบเวอร์ชันของ python interpreter ที่ติดตั้งในเครื่องของคุณจากบรรทัดคำสั่งโปรดอ้างอิงจากโพสต์ต่อไปนี้ - Python เวอร์ชันใดที่ฉันติดตั้งไว้?
RBT

1
นี่เป็นวิธีที่สนุกในการแยกไพ ธ อน 3 และ 2 ...python_version = int(str(range(3))[-2])
23419

@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'ฯลฯ ) เพื่อ tuple ตามที่คุณต้องการ อย่างไรก็ตามโปรดทราบว่าเป็นการดีกว่าที่จะ "เป็ด" ตรวจสอบว่ามีคุณลักษณะบางอย่างอยู่หรือไม่หากไม่สามารถแก้ปัญหาได้ (หรือประกันตัวออก) บางครั้งคุณสมบัติจะหายไปในรุ่นที่ใหม่กว่าถูกแทนที่ด้วยคุณสมบัติอื่น


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

1
@gcb ข้อมูลโค้ดของคุณจะแตกเมื่อใดก็ตามที่ Python 4 เกิดขึ้น if sys.version_info >= (3,)คุณควรจะทำ มันเป็น pythonic ทั้งหมดเพื่อเปรียบเทียบสิ่งอันดับขนาดต่างกันและมันจะทำสิ่งที่ถูกต้อง
บอริส

374

จากบรรทัดคำสั่ง (หมายเหตุทุน 'V'):

python -V

เอกสารนี้มีไว้ใน 'man python'


13
capital 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
@ โซริน: คุณช่วยอธิบายได้ไหมว่ามันดีกว่าคำตอบของเซทไหม? เนื่องจากคุณระบุว่าสิ่งนี้ดีที่สุดฉันจึงสงสัย
0xC0000022L

3
@ 0xC0000022L คุณเคยสงสัยบ้างไหมว่าคุณจะเปรียบเทียบข้อความจาก tuple ได้อย่างไร? 'ขั้นสุดท้าย' เปรียบเทียบกับเบต้า RC หรืออะไรก็ตามที่เป็นไปได้ หากคุณมีค่าตัวเลขคุณจะสามารถระบุรุ่นที่แน่นอนได้เสมอ
sorin

1
@ โซริน: เอ่อมันไม่สำคัญใช่มั้ย หากฉันเปรียบเทียบกับ(2,6,4)สิ่งที่'final'ดูเหมือนจะไม่ส่งผลกระทบต่อการเปรียบเทียบและไม่ควรทำ เห็นได้ชัดว่าไม่จำเป็นต้องมีการแบ่งส่วนเมื่อฉันเปรียบเทียบส่วน "สำคัญที่สุด" ของ tuple นี่น่าจะเป็นวิธีที่ได้รับการปฏิบัติและนั่นคือสิ่งที่คำถามของฉันเกี่ยวกับ ฉันไม่ได้กำลังพูดว่าวิธีนี้ไม่มีข้อดี แต่ก็แค่สงสัยว่าทำไมมันถึงดีที่สุด - นั่นคือสิ่งที่ฉันคิดถึง
0xC0000022L

11
ระดับการเปิดตัวจะถูกกำหนดให้เป็นหนึ่งใน 'อัลฟา', 'เบต้า', 'ผู้สมัคร' หรือ 'สุดท้าย' ซึ่งยังเกิดขึ้นจะเปรียบเทียบได้อย่างถูกต้อง ...
Fredrik

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 รหัสนี้จะเข้ากันได้กับงูหลามรุ่นเก่า:

>>> 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 ซึ่งจะถูกโยนทิ้งหากคุณพยายามใช้ไวยากรณ์ใหม่ในไพ ธ อนเก่าเช่นพยายามใช้ทางลัดแบบมีเงื่อนไขใน pre-2.5
เซท

except Exceptionกว้างเกินไป การใช้ข้อยกเว้นเฉพาะที่คุณคาดไว้จะดีกว่าหรือไม่
แฟร์ Paradox Fermi

1
@Fermiparadox - การเป็นคนในวงกว้างทำให้สมมติฐานอยู่ในระดับต่ำ except Exception:สายด้วยตัวเองแล้วถือว่าทันสมัย (2.x +) หลาม บางทีไพ ธ อนในอนาคตอาจจะจัดเรียงชื่อข้อยกเว้นใหม่ด้วยวิธีย้อนกลับที่เข้ากันไม่ได้? (อาจไม่ใช่ แต่ใครจะรู้ว่างูหลามจะมีลักษณะอย่างไรใน 20 ปีเมื่อเราทุกคนมีการปลูกถ่ายดวงตากลมโตรหัส? ใช้เวลานาน)
เซท

65

ใช้platform'spython_versionจาก STDLIB นี้:

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

5
สำหรับ funtion การพิมพ์มันจะดีกว่าในวงเล็บคิดเกี่ยวกับความเข้ากันได้ หากมีคนใช้ตัวอย่างในรุ่น 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)

ที่ด้านบนของสคริปต์ของคุณ

โปรดทราบว่าไพ ธ อนรุ่นเก่ากว่าเป้าหมายอาจไม่สามารถโหลดสคริปต์ได้ดังนั้นขึ้นอยู่กับว่ามีอะไรในสคริปต์ของคุณดังนั้นจึงไม่ไกลพอที่จะรายงานข้อผิดพลาดนี้ คุณสามารถเรียกใช้ข้างต้นในสคริปต์ที่นำเข้าสคริปต์ด้วยรหัสที่ทันสมัยกว่า


6
นี้ไม่ถูกต้อง (หรืออย่างน้อยไม่สมบูรณ์) เพราะล่ามเก่าจะ barf x if Pred() else yกับภาษาใหม่สร้างเช่น พวกเขาจะตายในช่วง "lexing" และไม่เคยมีโอกาสที่จะประหารชีวิต จริงexit(1)คำตอบของเซทนั้นถูกต้องในการห่อหุ้มฟีเจอร์ภาษาใหม่ในไฟล์อื่น
Mark Rushakoff

2
@MarkRushakoff: ความคิดเห็นของคุณสับสน คำตอบนี้ผิดด้านใด? elseสาขาที่หายไปหรือที่<ใช้สำหรับversion_info? AFAIK Python แผ่นรองที่ขาดหายไปในสิ่งอันดับและทั้งหมดนี้ควรจะถูกต้องก่อน 2.6, ไม่? ดังนั้นคำตอบของเซทจึงใช้การแบ่งส่วน (ซ้ำซ้อน) ในขณะที่คำตอบนี้ไม่ได้ทำให้ความคิดเห็นของคุณสับสนมากยิ่งขึ้น
0xC0000022L

5
ฉันคิดว่าสิ่งที่ @MarkRushakoff พูดก็คือถ้าคุณมีสิ่งนี้อยู่ด้านบนของไฟล์และคุณลักษณะภาษาใหม่ที่อื่นในไฟล์เดียวกันไพ ธ อนรุ่นเก่าจะตายเมื่อทำการโหลดไฟล์ก่อนที่จะรันไฟล์ใด ๆ ดังนั้นข้อผิดพลาดจะไม่ปรากฏ โดยทั่วไปคุณต้องใส่ด้านบน (หรือตรวจสอบอื่น) ที่ด้านบนของไฟล์จากนั้นนำเข้ารหัสที่ต้องใช้หลามเวอร์ชั่นใหม่จากไฟล์แยกต่างหาก
rjmunro

1
อ๋อสิ่งที่ @rjmunro พูดถึง :)
Mark Rushakoff

25

ต่อไปนี้เป็นเวอร์ชัน 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)

1
@vigilancer ถูกต้องในขณะที่เขียนมันยังไม่เกี่ยวข้อง แต่ฉันได้อัปเดตสำหรับ Python 3 ตอนนี้ :)
Wolph

ดีนี้แก้ปัญหาของฉันที่ฉันได้รับหมายเลขรุ่นโดยการจับผลลัพธ์python2 --versionและpython3 --versionจาก PHP ในขณะที่ฉันจะได้รับหลังโดยไม่มีปัญหาผ่านทางpassthru()อดีตจะพิมพ์ไปที่หน้าจอ แต่ไม่เคยถูกจับแม้เมื่อเปลี่ยนเส้นทางไปยังไฟล์ ...
Tox

1
@tox คุณสามารถบอกprint() ให้เขียนไฟล์ถ้ามันสะดวกกว่า
Wolph

ในกรณีของฉันที่จะเหมือนกันมากกว่าที่ฉันเปลี่ยนเส้นทาง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

วิธีที่ง่ายที่สุด

เพียงพิมพ์หลามในเทอร์มินัลของคุณและคุณสามารถดูเวอร์ชันดังต่อไปนี้

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

เช่นเดียวกับ 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

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/ซึ่งเป็นสคริปต์สำหรับทดสอบตัวอย่างโค้ดบนไพ ธ อนหลายรุ่นในคราวเดียวเพื่อให้คุณเข้าใจได้ง่ายว่าไพ ธ อนเป็นอย่างไร คุณสมบัติที่เข้ากันได้กับงูหลามรุ่นใด:

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 -Vหรือpython --versionหรือapt-cache policy python

คุณยังสามารถเรียกใช้whereis pythonเพื่อดูจำนวนรุ่นที่ติดตั้ง


3
คำตอบเดียวกันถูกโพสต์แล้ว และคำถามนี้ไม่ใช่ "ฉันจะตรวจสอบว่าฉันติดตั้งไพ ธ อนรุ่นใดได้อย่างไร" แต่ "ฉันจะตรวจสอบเวอร์ชันในสคริปต์ของฉัน" ได้อย่างไร
Stanley Kou

2

หากคุณต้องการตรวจจับพรี - ไพ ธ อน 3 และไม่ต้องการนำเข้าอะไร ...

... คุณสามารถ (ab) ใช้การเปลี่ยนแปลงการกำหนดขอบเขตความเข้าใจรายการและทำใน นิพจน์เดียว :

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

2

ในการตรวจสอบเวอร์ชั่นของ 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'

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

สำหรับงูหลาม 2.7 print("sys.version: {}".format(version))เราจะต้องใช้
Marco

@Marco ใช่มั้ย การจัดรูปแบบสตริงเสร็จแล้วสำหรับ v 3+ พร้อมอาร์กิวเมนต์หลัก สามารถทำได้ในรูปแบบการพิมพ์ ('[{}, {}, {}]'. รูปแบบ (1,2,3)) สำหรับ python 2.7 อ้างอิง: stackoverflow.com/questions/517355/string-formatting-in-python
oetzi

1

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 (สตริง) และอนุกรม
Mikhail Edoshin

0

วิธีที่ง่ายที่สุดคือ:

ใน Spyder ให้เริ่ม "IPython Console" ใหม่จากนั้นเรียกใช้สคริปต์ที่มีอยู่ของคุณ

ตอนนี้เวอร์ชันสามารถเห็นได้ในเอาต์พุตแรกที่พิมพ์ในหน้าต่างคอนโซล:

"Python 3.7.3 (ค่าเริ่มต้น, 24 เม.ย. 2019, 15:29:51) ... "

ป้อนคำอธิบายรูปภาพที่นี่


0

ในการตรวจสอบจากบรรทัดคำสั่งในคำสั่งเดียว แต่รวมหลัก, รอง, รุ่นไมโคร, 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 ++ เป็นต้นมีประโยชน์สำหรับการบันทึกการทำซ้ำ .


-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เวอร์ชั่นภายในสคริปต์และยังมีคำตอบที่คล้ายกันที่โพสต์ไว้ก่อนหน้าแล้ว: stackoverflow.com/a/35294211/950762
Akif
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.