python == python2 หรือ python == python3? จะทำแพ็คเกจ, แจกจ่ายสคริปต์ python py2k ได้อย่างไร?


10

ทั้งนี้ขึ้นอยู่กับระบบpython== python2หรือ==pythonpython3

สคริปต์ Python ที่ทำงานได้เริ่มต้นด้วย:

#!/usr/bin/env python
#!/usr/bin/env python2
#!/usr/bin/env python3...

สำหรับ python py3k มีให้ในเอกสารฉันควร / สามารถใช้กับหมายเลขเวอร์ชั่นได้ดังนั้นฉันจะทำสิ่งนี้:

#!/usr/bin/env python3

แต่ฉันพบปัญหากับสคริปต์ py2k

ในขณะที่อยู่ในเอกสารประกอบ py2kมันถูกเขียนขึ้นเพื่อใช้: #! /usr/bin/env python,

ในบาง * nix-es python py3k เป็นค่าเริ่มต้นดังนั้น python == python3 (ตัวอย่างเช่นแพคเกจ ArchLinux pythonนี่คือไฟล์แพ็คเกจ python )

วิธีจัดทำแพ็กเกจ (กำหนดค่า, สร้าง) และ / หรือเตรียมสคริปต์ไพ ธ อนสำหรับการแจกจ่ายเพื่อจัดการกับสิ่งนั้น?

ฉันถามเกี่ยวกับการสร้างชุดซอฟต์แวร์ที่ผู้ใช้สามารถเรียกใช้ได้ง่าย (โดยไม่ต้องดัดแปลงสภาพแวดล้อม)

ฉันสามารถทำแบบเดียวกันกับสคริปต์ python py2k สำหรับสคริปต์ python py3k และตั้งเป็น: #!/usr/bin/env python2? ฉันจะแน่ใจได้ว่าแต่ละกระจายหลาม py2k มีpython2ไฟล์เพื่อให้#!/usr/bin/env python2จะทำงานอย่างไร

ถ้าใช่ทำไมมันไม่เสนอเป็นมาตรฐานตัวอย่างเช่นในเอกสารหลาม py2k ?


4
เท่าที่ฉันรู้คุณสามารถใช้python2เพื่อเรียกใช้ (ถ้าติดตั้ง) และคุณสามารถตรวจสอบรุ่นpython -Vได้เสมอ ถ้าคุณต้องการที่pythonจะเป็น 2 หรือ 3 คุณควรrm /usr/bin/pythonแล้วสร้าง symlink ที่จุดจาก desierd ln -s /usr/bin/python2.5 /usr/bin/pythonรุ่นหลามเช่นคุณ
Hanan N.

python2ขอขอบคุณสำหรับการสร้างความมั่นใจเกี่ยวกับฉัน ฉันสงสัยว่าทำไมมันไม่เป็นมาตรฐานที่จะใช้เมื่อมี py2k และ py3k และค่าเริ่มต้นpythonอาจแตกต่างกัน คำแนะนำของคุณเกี่ยวกับการลบ - มันไม่เหมาะกับตัวอย่างนี้เพราะฉันถามเกี่ยวกับบรรจุภัณฑ์ ฉันต้องการสร้างแพ็คเกจที่สามารถทำงานในการกำหนดค่า / ระบบที่แตกต่างกัน ไม่มีวิธีเกี่ยวกับการแก้ไขสภาพแวดล้อม สิ่งที่เกี่ยวกับการตรวจสอบ - มันใช้ไม่ได้กับShebang - เท่าที่ฉันรู้
Grzegorz Wierzowiecki

ผมเชื่อว่าสิ่งที่ @Hanan N. พยายามที่จะบอกคุณได้ว่าถ้าคุณเขียนรหัส 2.x งูใหญ่แล้วใช้#!...python2ในโปรแกรมของคุณและถ้าคุณกำลังใช้งูหลาม 3.x #!...python3ใช้แล้ว อย่าพึ่งพาระบบปฏิบัติการเพื่อให้มีลิงค์ที่ถูกต้องหากคุณรู้ว่ามันใช้งานได้กับรุ่นเฉพาะเท่านั้น ผมทำงานกับระบบซึ่งยังคงได้ Python 1.5.2 การติดตั้งเป็น/usr/bin/python- python2ฉันเขียนโค้ดอย่างใดอย่างหนึ่งในการจัดการเก่ารุ่นหลามหรือการใช้งาน
Arcege

2
@Arcege ฉันไม่มีpython2ไฟล์ที่เรียกใช้บนระบบของฉัน (Debian บีบ) pythonเป็น symlink ไปpython2.6และpython3เป็น symlink ไปแต่ไม่มีpython3.1 python2
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


3

สคริปต์สามารถตรวจสอบเวอร์ชัน Python ของมันและถ้าเป็น Python 3 ให้เริ่มต้นตัวเองใหม่โดยใช้ Python 2 เพิ่มคำสั่งต่อไปนี้ใกล้กับส่วนหัวของสคริปต์:

if sys.version > '3':
  python2 = os.popen('which python2 2> /dev/null').read().rstrip()
  if python2:
    args = sys.argv[:]
    args.insert(0,python2)
    os.execv(python2,args)
  else:
    sys.exit("%s requires Python Version 2 (python2 not in PATH)" % os.path.basename(__file__))

นี้ใช้ระบบwhichคำสั่งในการค้นหาในสภาพแวดล้อมpython2 PATHจากนั้นจะเปิดตัวอีกครั้งด้วยตัวเอง (หรือยกเลิกหากไม่สามารถหาได้)

โปรดทราบว่าสคริปต์จะต้องเป็นไวยากรณ์ Python 3 ที่ถูกต้องเพื่อให้สคริปต์เริ่มต้นใน Python 3

นอกจากนี้เอาต์พุตใด ๆ ควรถูกลบทิ้งก่อนการexecvโทรมิฉะนั้นจะหายไป ตัวอย่างเช่นการเพิ่มsys.stdout.flush()ก่อนการเรียกเพื่อexecvจะล้างprintคำสั่งใด ๆ


1

ในรุ่นเก่ามีก็อาจจะเป็นแทนpython python2ในการทำให้เส้น sheebang ของคุณชัดเจนขึ้นคุณสามารถสร้างลิงก์python2 -> pythonเพื่อใช้งาน#!/usr/bin/env python2ได้


อย่างไรก็ตามมันไม่ได้แก้ปัญหาที่ระบุ เนื่องจากคำถามคือวิธีที่จะทำให้สคริปต์ของคุณพกพาได้ดีดังนั้นจึงสามารถทำงานได้ในทุกสภาพแวดล้อมที่กล่าวถึง (ด้วย "python" "python2" ฯลฯ )
Grzegorz Wierzowiecki

1

ฉันคิดว่ามีการกำหนด "มาตรฐาน" ไว้ในhttps://www.python.org/dev/peps/pep-0394/

PEP นี้จัดให้มีการประชุมเพื่อให้แน่ใจว่าสคริปต์ Python สามารถดำเนินการต่อได้แบบพกพาในระบบ * nix โดยไม่คำนึงถึงเวอร์ชันเริ่มต้นของ Python interpreter (เช่นเวอร์ชันที่เรียกใช้โดยคำสั่ง python)

  • python2 จะอ้างถึง Python 2.x บางรุ่น
  • python3 จะอ้างถึง Python 3.x บางรุ่น
  • ในขณะนั้นการแจกแจงทั้งหมดควรทำให้มั่นใจว่า python อ้างถึงเป้าหมายเดียวกันกับ python2
  • อย่างไรก็ตามผู้ใช้ควรทราบว่า python อ้างถึง python3 อย่างน้อย Arch Linux (การเปลี่ยนแปลงนั้นเป็นสิ่งที่กระตุ้นให้สร้าง PEP นี้) ดังนั้น python จึงควรใช้ในบรรทัด shebang เฉพาะสำหรับสคริปต์ที่แหล่งที่เข้ากันได้กับทั้ง Python 2 และ 3
  • ในการเตรียมตัวสำหรับการเปลี่ยนแปลงครั้งสุดท้ายในเวอร์ชันเริ่มต้นของ Python สคริปต์ Python 2 เท่านั้นควรได้รับการอัปเดตให้เป็นแหล่งที่เข้ากันได้กับ Python 3 หรืออื่น ๆ เพื่อใช้ python2 ในบรรทัด shebang
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.