setuptools vs. distutils: ทำไม distutils ยังคงเป็นเรื่อง


143

งูหลามมีประวัติศาสตร์อันสับสนของเครื่องมือที่สามารถใช้ในการจัดแพคเกจและอธิบายโครงการ: เหล่านี้รวมถึงdistutilsในห้องสมุดมาตรฐานdistribute, distutils2และsetuptools(และอาจจะมากกว่า) ปรากฏว่าdistributeและdistutils2ถูกยกเลิกในความโปรดปรานsetuptoolsซึ่งออกจากสองมาตรฐานการแข่งขัน

เพื่อความเข้าใจของฉันsetuptoolsมีตัวเลือกมากขึ้น (เช่นการประกาศการอ้างอิงการทดสอบและอื่น ๆ ) มากกว่าdistutilsแต่มันไม่รวมอยู่ในไลบรารี่มาตรฐานของไพ ธ อน (ยัง?)

หลามบรรจุภัณฑ์คู่มือการใช้งาน [ 1 ] แนะนำขณะนี้:

ใช้setuptoolsเพื่อกำหนดโครงการและสร้างการกระจายแหล่งที่มา

และอธิบาย:

แม้ว่าคุณสามารถใช้บริสุทธิ์distutilsสำหรับโครงการจำนวนมากก็ไม่สนับสนุนการกำหนดอ้างอิงในโครงการอื่น ๆ setuptoolsและจะหายไปสาธารณูปโภคอำนวยความสะดวกหลายอย่างสำหรับประชากรโดยอัตโนมัติเมตาดาต้าแพคเกจได้อย่างถูกต้องที่ให้ไว้โดย เมื่ออยู่นอกไลบรารีมาตรฐาน setuptools ยังมีฟีเจอร์ที่สอดคล้องกันมากขึ้นในเวอร์ชัน Python ที่แตกต่างกันและ (ต่างจากdistutils) setuptoolsจะได้รับการอัปเดตเพื่อสร้างรูปแบบมาตรฐาน“ Metadata 2.0” ที่กำลังจะเกิดขึ้นในทุกเวอร์ชั่นที่รองรับ

แม้แต่โครงการที่เลือกใช้distutilsเมื่อ pip ติดตั้งโครงการดังกล่าวโดยตรงจากแหล่งที่มา (แทนที่จะติดตั้งจากไฟล์ล้อที่สร้างไว้ล่วงหน้า) มันจะสร้างโครงการของคุณโดยใช้setuptoolsแทน

อย่างไรก็ตามการดูไฟล์setup.pyของโครงการต่างๆพบว่าสิ่งนี้ดูเหมือนจะไม่ได้มาตรฐานจริง แพ็คเกจจำนวนมากยังคงใช้งานอยู่distutilsและแพ็คเกจที่สนับสนุนsetuptoolsมักจะผสมsetuptoolsกับdistutilsตัวอย่างเช่นโดยการนำเข้าทางเลือก:

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

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

เหตุใดผู้คนจึงยังคงพยายามสนับสนุนdistutilsเป็นพิเศษ- ความจริงที่setuptoolsไม่ได้อยู่ในห้องสมุดมาตรฐานเป็นเหตุผลเดียว? อะไรคือข้อดีของdistutilsและจะมีข้อบกพร่องในการเขียนใด ๆsetup.pysetuptoolsแฟ้มที่สนับสนุนเท่านั้น


4
distutilsถูกรวมกลับเข้าไปsetuptoolsแต่มีแอปรุ่นเก่าที่เขียนขึ้นเพื่อใช้งานdistutilsและมีค่าใช้จ่ายที่เกี่ยวข้องกับการโยกย้ายเพื่อแก้ไขมาตรฐาน
metatoaster

3
"ดูเหมือนว่าการแจกจ่ายและ distutils2 ถูกยกเลิกเพื่อประโยชน์ของ setuptools" ถูกต้องแจกจ่ายเป็นเพียง wrapper สำหรับ setuptools ตอนนี้และdistutils2ก็ตายแล้ว
kay - SE ชั่วร้าย

1
setuptoolsเป็นทางเลือกที่ได้รับการปรับปรุงให้ดีขึ้นdistutilsแต่โปรดทราบว่า " ตัวติดตั้งpip ที่แนะนำจะเรียกใช้สคริปต์ setup.py ทั้งหมดด้วยsetuptoolsแม้ว่าสคริปต์นั้นจะนำเข้าเท่านั้นdistutils " ( แหล่งที่มา )
user2314737

คำตอบ:


77

ลองดูที่คำถาม SO นี้ มันอธิบายวิธีการบรรจุภัณฑ์ทั้งหมดได้เป็นอย่างดีและอาจช่วยตอบคำถามของคุณได้บ้าง: ความแตกต่างระหว่างการแจกจ่าย distutils, setuptools และ distutils2?

Distutilsยังคงเป็นเครื่องมือมาตรฐานสำหรับบรรจุภัณฑ์ใน Python มันรวมอยู่ในไลบรารีมาตรฐาน (Python 2 และ Python 3.0 ถึง 3.3) มันมีประโยชน์สำหรับการแจกแจงของ Python อย่างง่าย แต่ขาดคุณสมบัติ มันแนะนำแพ็คเกจ Python distutils ที่สามารถนำเข้าในสคริปต์ setup.py ของคุณ

Setuptoolsได้รับการพัฒนาเพื่อเอาชนะข้อ จำกัด ของ Distutils และไม่รวมอยู่ในไลบรารีมาตรฐาน แนะนำอรรถประโยชน์บรรทัดคำสั่งที่เรียกว่า easy_install นอกจากนี้ยังนำเสนอแพ็คเกจงูเหลือม setuptools ที่สามารถนำเข้าในสคริปต์ setup.py ของคุณและแพ็คเกจ pkg_resources Python ที่สามารถนำเข้าในรหัสของคุณเพื่อค้นหาไฟล์ข้อมูลที่ติดตั้งพร้อมกับการแจกจ่าย หนึ่งใน gotchas ของมันคือลิงติดแพทช์แพ็คดิททิท ควรทำงานกับ pip ได้ดี รุ่นล่าสุดได้เปิดตัวในเดือนกรกฎาคม 2013

ดังนั้นในขณะที่คุณสามารถเห็น setuptools ควรจะชอบ distutils และฉันเห็นว่าคำถามของคุณมาจากไหน แต่ฉันไม่เห็น distutils ที่ขาดการสนับสนุนในไม่ช้าเมื่อเร็ว ๆ นี้อย่างง่าย ๆ มันถูกนำมาใช้ในหลาย ๆ กรณี . และอย่างที่คุณอาจจะรู้ว่าการเปลี่ยนแปลงสิ่งต่าง ๆ เหล่านี้ในโปรแกรมดั้งเดิมอาจเป็นเรื่องที่เจ็บปวดและมาพร้อมกับปัญหาเล็กน้อยเช่นความเข้ากันไม่ได้ซึ่งจะทำให้นักพัฒนาต้องเขียนซอร์สโค้ดใหม่ ดังนั้นจึงเป็นเช่นนั้นและความจริงที่ว่า distutils เป็นส่วนหนึ่งของคลังหลามมาตรฐานในขณะที่ setuptools ไม่ใช่ ดังนั้นหากคุณกำลังสร้างโปรแกรมไพ ธ อนในยุคนี้ลองใช้ setuptools แต่จำไว้ว่าหากไม่มี distutils แล้ว setuptools ก็ไม่เคยมีอยู่


3
"Distutils ยังคงเป็นเครื่องมือมาตรฐานสำหรับบรรจุภัณฑ์ใน Python" ขัดแย้งกับคู่มือผู้ใช้ Python Packaging
cel

1
ฉันไม่เชื่อเช่นนั้นหรือไม่บอกอย่างชัดเจนว่าsetuptoolsเป็นมาตรฐาน โปรดทราบด้วยว่าวลีนั้นอ้างจากเว็บไซต์ที่ฉันให้ไว้ดังนั้นข้อความเหล่านั้นไม่ใช่คำของฉัน อย่างไรก็ตามมันเป็นความเห็นที่ฉันในหมู่คนอื่น ๆ เห็นด้วยกับ

ฉันมอบรางวัลให้คุณเนื่องจากชุมชนดูเหมือนจะเห็นด้วยกับคุณ น่าเสียดายที่คำถามนี้ไม่ได้รับความสนใจเท่าที่ฉันต้องการ
cel

easy_install เป็นสาเหตุหลักที่ฉันปฏิเสธ setuptools ซึ่งเป็นปัญหาใหญ่สำหรับฉันในแพ็คเกจที่ใช้งาน (ง่ายกว่าที่จะเพียงแค่หีบห่อใหม่) คุณสมบัติอื่น ๆ ก็โอเค
Stuart Gathman

14

เป็นความจริงที่ setuptools ไม่ได้อยู่ในห้องสมุดมาตรฐานด้วยเหตุผลเพียงอย่างเดียว

นั่นเป็นเหตุผลข้อหนึ่ง ต่อไปนี้เป็นตรงจากNumPysetup.py :

if len(sys.argv) >= 2 and ('--help' in sys.argv[1:] or
        sys.argv[1] in ('--help-commands', 'egg_info', '--version',
                        'clean')):
    # Use setuptools for these commands (they don't work well or at all
    # with distutils).  For normal builds use distutils.
    try:
        from setuptools import setup
    except ImportError:
        from distutils.core import setup

ดังนั้น NumPy ชอบsetuptoolsถ้ามันสามารถหาได้ แต่ SciPy เคยทำเช่นนี้จนกว่าจะได้รับการแก้ไขเพื่อให้ได้รับความนิยมdistutilsในบางสถานการณ์ อ้างถึงบันทึกการกระทำ:

Setuptools sets mode +x on the test scripts, so that Nose refuses to run
them. Better not do that.

แน่นอนการควบรวมกิจการระหว่างsetuptoolsและdistributeควรแก้ไขทั้งหมดนี้ในเวลาที่กำหนด แต่แพคเกจจำนวนมากยังคงต้องสนับสนุนการติดตั้ง Python 2.6


1
distributeเคยเป็นทางแยกsetuptoolsและได้รวมกลับมาแล้ว
R4444

10

มีเหตุผลหลายประการที่เรายังคงพูดถึงและใช้ distutils แม้ว่า setuptools ไม่ต้องสงสัยเลยว่าชุดเครื่องมือที่ดีกว่า

ประการแรก distutils สามารถใช้ได้ทุกที่ หากคุณต้องการสร้างโมดูลสำหรับการแบ่งปันกับผู้อื่นและไม่มีข้อกำหนดที่ซับซ้อนใด ๆ รับประกันได้ว่าจะมีอยู่ในเครื่องทำงานของคุณ นี่เป็นสิ่งสำคัญอย่างยิ่งหากคุณต้องสนับสนุนงูหลามรุ่นเก่ากว่าหรือหากคุณพบว่าตัวเองทำงานในสภาพแวดล้อมที่ไม่คุ้นเคย

ประการที่สอง setuptools ให้การปรับปรุง distutils ดังนั้นจึงเป็นแบบจำลองหลังจากชุดเครื่องมือ distutils และนำโครงสร้างทั้งหมดมาจากที่นั่น เอกสารประกอบสำหรับ setuptools ถือว่าผู้อ่านคุ้นเคยกับ distutils และมีเพียงเอกสารว่าจะปรับปรุงชุดเครื่องมือพื้นฐานอย่างไร คุณสามารถคิดได้ว่า distutils จะกำหนดภาษาและ setuptools ช่วยเพิ่มภาษานั้น

แนวทางส่วนตัวของฉันสำหรับโครงการใหม่เริ่มต้นด้วยสมมติฐานที่ฉันจะใช้ distutils เมื่อโครงการเติบโตขึ้นเพื่อต้องการคุณสมบัติของ setuptools ฉันจะทำการอัพเกรดได้อย่างไร setuptools เป็นแบบแทนที่สำหรับ distutils มันเป็นการเปลี่ยนแปลงหนึ่งบรรทัดใน setup.py ของฉัน


ขอบคุณสำหรับคำตอบ. ฉันคิดว่าอาร์กิวเมนต์ความพร้อมใช้งานไม่สามารถเป็นสิ่งสำคัญได้เนื่องจากการติดตั้ง setuptools สามารถบูตได้ ฉันเห็นว่าถ้า distutils ให้ความสามารถในการใช้งานเพียงพอ - มันสมเหตุสมผลที่จะใช้ แต่การผสม distutils และ setuptools ในความคิดของฉันไม่ใช่วิธีที่สะอาดมากในการบรรลุเป้าหมาย แม้ว่า @larsmans แสดงให้เห็นในคำตอบของเขาปัญหาบางอย่างกับ setuptools ซึ่งบังคับให้ใช้ distutils สำหรับงานบางอย่าง
cel

9

โดยทั่วไปมันเกิดจากการแบ่งความรับผิดชอบ

setuptoolsไม่ได้เป็นส่วนหนึ่งของ Python standard library เพราะมันถูกดูแลโดยบุคคลที่สามมากกว่า Python core team ซึ่งหมายความว่าเหนือสิ่งอื่นใด:

  • มันไม่ได้ครอบคลุมโดยชุดทดสอบหลักและไม่ได้ขึ้นอยู่กับฟังก์ชันการทำงานหลัก
  • มันไม่ได้ตัวเองกำหนดมาตรฐานหลักสำหรับ Add-on โมดูล (ตำแหน่งของพวกเขาหมายถึงการนำเข้าขยาย C ไบนารีอินเตอร์เฟซ ฯลฯ )
  • มันได้รับการปรับปรุงและเผยแพร่อย่างเป็นอิสระจากการวางจำหน่ายของ Python

ได้อย่างมีประสิทธิภาพทีมงานหลักได้แคบลงขอบเขตของ distutilsเที่ยงแท้ว่า "มาตรฐานหลัก" และ "น้อยที่สุดที่จำเป็นรวบรวม" ส่วนสำหรับตัวเองในขณะที่ออกทุกสิ่งที่เกินกว่าที่ (รูปแบบคอมไพเลอร์ / แพ็กเกจขยายการสนับสนุน / อะไรก็ตาม) เพื่อให้บุคคลที่ 3 รหัสที่ก่อนหน้านี้ครอบคลุม "ส่วนเพิ่มเติม" นั้นค้างไว้เพื่อความเข้ากันได้ย้อนหลัง

จากการแจกจ่ายโมดูล Python - เอกสาร Python 2.7.12 :

ในขณะที่การใช้งานโดยตรงdistutilsถูกเลิกใช้ แต่ก็ยังคงวางรากฐานสำหรับโครงสร้างบรรจุภัณฑ์และการจัดจำหน่ายในปัจจุบันและไม่เพียง แต่จะเป็นส่วนหนึ่งของห้องสมุดมาตรฐานเท่านั้น แต่ยังมีชื่ออยู่ในรูปแบบอื่น ๆ ใช้เพื่อประสานงานการพัฒนามาตรฐานของบรรจุภัณฑ์ Python)

แพคเกจสำหรับระบบปฏิบัติการอื่น ๆ นั้นมีแนวโน้มที่จะให้setuptoolsและpipแยกกัน - ด้วยเหตุผลดังกล่าวข้างต้น

  • และเพราะมันไม่จำเป็น - หรือเป็นอันตรายต่อการบำรุงรักษา - เมื่อมีผู้จัดการแพคเกจอื่นในระบบอยู่แล้ว
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.