ความแตกต่างระหว่างการแจกแจง distutils, setuptools และ distutils2?


594

สถานการณ์

ฉันพยายามพอร์ตไลบรารีโอเพนซอร์ซกับ Python 3 ( SymPyหากมีใครสงสัย)

ดังนั้นฉันต้องทำงาน2to3โดยอัตโนมัติเมื่อสร้าง Python 3 ฉันต้องใช้distributeมัน ดังนั้นผมต้องพอร์ตระบบปัจจุบันซึ่ง (ตาม doctest) distutilsจะ


ปัญหา

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


คำถาม

มีคนอธิบายความแตกต่างได้ไหม ฉันควรใช้อะไรดี ทางออกที่ทันสมัยที่สุดคืออะไร (นอกเหนือจากนี้ฉันขอขอบคุณคู่มือบางอย่างเกี่ยวกับการย้ายไปที่Distributeแต่นั่นก็ไม่น่าเกินขอบเขตของคำถาม ... )


22
สับสนอย่างไร? ฉันมาหลามจากพื้นหลัง Java / C ++ ในสถานการณ์เหล่านั้นการกระจายตัวไปข้างหน้าอย่างตรงไปตรงมามาก ด้วย python ฉันสับสนอย่างสมบูรณ์เกี่ยวกับระบบการกระจายเหล่านี้
Raffi Khatchadourian

75
ฉันเห็นด้วยว่าการบรรจุ / การติดตั้ง Python มีทางเลือกมากเกินไปโดยไม่มีคำแนะนำที่ชัดเจนจากชุมชน
Sabuncu

6
ฉันแค่อยากจะเชื่อมโยงข้อมูลที่เกี่ยวข้องกับ pip ที่ไม่สนับสนุนการแจกแจงแบบไบนารีlucumr.pocoo.org/2012/6/22/hate-hate-hate-everywhere
pixelbeat

@pixelbeat pip รองรับการติดตั้งวงล้อ (ที่เรียกว่าการแจกแจงแบบไบนารี) ลิงก์นั้นล้าสมัย
Flimm

คำตอบ:


836

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

หลามบรรจุภัณฑ์คู่มือการใช้งานเป็นอ่านที่คุ้มค่า ทุกหน้ามีวันที่ "ปรับปรุงล่าสุด" ปรากฏขึ้นดังนั้นคุณสามารถตรวจสอบความใหม่ของคู่มือและมันค่อนข้างครอบคลุม ความจริงที่ว่าโฮสต์ในโดเมนย่อยของ python.org ของ Python Software Foundation เพียงเพิ่มความน่าเชื่อถือลงไป โครงการสรุปหน้ามีความเกี่ยวข้องโดยเฉพาะอย่างยิ่งที่นี่

สรุปเครื่องมือ:

นี่เป็นบทสรุปของภูมิบรรจุภัณฑ์ Python:

เครื่องมือที่รองรับ:

เครื่องมือที่เลิกใช้ / ถูกทอดทิ้ง:

  • distributesetuptoolsเป็นทางแยกของ มันใช้เนมสเปซเดียวกันร่วมกันดังนั้นหากคุณมีการกระจายการติดตั้งimport setuptoolsจริง ๆ แล้วจะนำเข้าแพคเกจการแจกจ่ายด้วยการแจกจ่าย การแจกจ่ายถูกรวมกลับเข้าไปใน Setuptools 0.7ดังนั้นคุณไม่จำเป็นต้องใช้การแจกจ่ายอีกต่อไป อันที่จริงแล้วเวอร์ชันของ Pypi เป็นเพียงเลเยอร์ที่ใช้งานร่วมกันได้ซึ่งติดตั้ง Setuptools

  • distutils2เป็นความพยายามที่จะใช้เวลาที่ดีที่สุดของdistutils, setuptoolsและdistributeและกลายเป็นเครื่องมือมาตรฐานรวมอยู่ในห้องสมุดมาตรฐานของงูใหญ่ แนวคิดก็คือdistutils2จะแจกจ่ายให้กับ Python เวอร์ชันเก่าและdistutils2จะเปลี่ยนชื่อเป็นpackagingPython 3.3 ซึ่งจะรวมไว้ในไลบรารีมาตรฐาน แผนเหล่านี้ไม่ได้เป็นไปตามที่ตั้งใจไว้อย่างไรและขณะนี้เป็นโครงการที่ถูกทิ้งร้างdistutils2 รุ่นล่าสุดคือในเดือนมีนาคม 2012 และหน้าแรกของ Pypi ได้รับการปรับปรุงเพื่อให้สะท้อนถึงความตาย

อื่น ๆ :

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

คำแนะนำ:

หากทั้งหมดนี้เป็นเรื่องใหม่สำหรับคุณและคุณไม่รู้ว่าจะเริ่มต้นอย่างไรฉันจะแนะนำการเรียนรู้setuptoolsพร้อมกับpipและvirtualenvซึ่งทั้งหมดนี้ทำงานร่วมกันได้ดีมาก

หากคุณกำลังมองหาในการvirtualenvที่คุณอาจจะสนใจในคำถามนี้คือความแตกต่างระหว่างสิ่งที่venv, pyvenv, pyenv, virtualenv, virtualenvwrapperetc? . (ใช่ฉันรู้ฉันครวญครางกับคุณ)


2
@makeramen: ดูหัวข้อนี้ในรายการทางไปรษณีย์
Flimm

6
และไม่ได้ดูดีกว่านี้: 'Distribute' is a now deprecated fork of the 'Setuptools' project.@ หน้าแจกจ่าย PyPI
KurzedMetal

3
@KurzedMetal ตามที่ SetupTools folks นั้น setuptools 0.7 จะให้ทั้งการแจกจ่ายและ setuptools เก่าที่เรียกคืนสู่จักรวาล ดังนั้นสิ่งต่าง ๆ จึงถูกตั้งค่าให้ปรับปรุงอย่างมาก!
John McDonnell

8
หลามบรรจุภัณฑ์คู่มือการใช้งานจะมีข้อมูลขึ้นไปวันที่มากที่สุดในรัฐของบรรจุภัณฑ์หลาม มันเป็นข้อสังเกตโดย Nick Coughlan ที่PyCon 2013
imanuelcostigan

1
@Flimm การแก้ไขครั้งล่าสุดเมื่อไม่นานมานี้ ตอนนี้ Bento เป็นผู้ใหญ่แล้วหรือยัง
Martin Thoma

251

ฉันเป็นผู้ดูแลและผู้จำหน่าย distutils 2 / ผู้บรรจุภัณฑ์ ฉันได้พูดคุยเกี่ยวกับบรรจุภัณฑ์ Python ที่ ConFoo 2011 และวันนี้ฉันกำลังเขียนเวอร์ชันเพิ่มเติม ยังไม่ได้เผยแพร่ดังนั้นนี่เป็นข้อความที่ตัดตอนมาซึ่งจะช่วยกำหนดสิ่งต่างๆ

  • Distutilsเป็นเครื่องมือมาตรฐานที่ใช้สำหรับบรรจุภัณฑ์ มันทำงานได้ค่อนข้างดีสำหรับความต้องการที่เรียบง่าย แต่มี จำกัด และไม่สำคัญที่จะขยาย

  • Setuptoolsเป็นโครงการที่เกิดจากความปรารถนาที่จะเติมฟังก์ชันการทำงานที่ขาดหายไปและสำรวจเส้นทางใหม่ ในชุมชนย่อยบางแห่งมันเป็นมาตรฐานตามความเป็นจริง มันใช้การปะแก้ของลิงและเวทย์มนตร์ที่นักพัฒนาหลักของ Python ใช้

  • การแจกจ่ายเป็นทางแยกของ Setuptools ที่เริ่มต้นโดยนักพัฒนารู้สึกว่าการพัฒนาของมันช้าเกินไปและมันเป็นไปไม่ได้ที่จะพัฒนามัน การพัฒนาของมันช้ามากเมื่อ distutils 2 เริ่มต้นโดยกลุ่มเดียวกัน อัปเดต 2013- สิงหาคม: การแจกจ่ายจะถูกรวมเข้าใน setuptools และหยุดการทำงาน

  • Distutils2เป็นห้องสมุด distutils ใหม่เริ่มต้นจากการแยกฐานรหัส distutils ด้วยความคิดที่ดีที่นำมาจากเครื่องมือการติดตั้ง ชื่อจริงที่คุณใช้เพื่อนำเข้า Distutils2 อยู่packagingในไลบรารีมาตรฐาน Python 3.3+ หรือdistutils2ใน 2.4+ และ 3.1–3.2 (backport จะใช้งานได้เร็ว ๆ นี้) Distutils2 ไม่ได้เปิดตัว Python 3.3 และถูกพักไว้

ข้อมูลเพิ่มเติม:

ฉันหวังว่าจะเสร็จสิ้นคำแนะนำของฉันในไม่ช้ามันจะมีข้อมูลเพิ่มเติมเกี่ยวกับจุดแข็งและจุดอ่อนของห้องสมุดแต่ละแห่งและแนวทางการเปลี่ยนแปลง


1
ไม่ distutils2 ใช้ความคิดที่ดีจาก setuptools / แจกจ่ายหลังจากสร้างมาตรฐาน (PEPs) หรือไม่ (ตัวอย่างเช่นฉันให้คำปรึกษากับนักเรียน GSoC ที่กำลังเพิ่มคำสั่งพัฒนาและสร้างสคริปต์อัตโนมัติ) แต่จะไม่เป็นแบบดรอปอิน การแทนที่: มีบางส่วนที่เราไม่ต้องการ (ไข่การรวม VCS และอื่น ๆ ) OTOH, distutils2 มีบางสิ่งที่ setuptools / แจกจ่ายไม่ได้ เพื่อให้ง่ายต่อการเปลี่ยนแปลงฉันคิดว่าผู้พัฒนาแจกจ่ายอาจจะใช้ distutils 2 เพื่อรองรับมาตรฐานและเครื่องมือใหม่ ๆ ฉันยังคิดว่าฉันจำนักพัฒนา setuptools ที่บอกว่าเขาต้องการสนับสนุนมาตรฐานใหม่
Éric Araujo

1
ez_setup อยู่ตรงไหนทั้งหมดนี้? มีการอัพเดทสถานะ distutils2 หรือไม่?
James McMahon

2
@ ÉricAraujoขออภัยที่ทราบเกี่ยวกับความล่าช้า ฉันหวังว่ามันจะพร้อมในเวลาสำหรับ 3.4! ฉันชอบงูใหญ่ แต่บรรจุภัณฑ์ทำให้ฉันหัวของฉันกระแทกกับกำแพงเสมอ (ในข่าวอื่น ๆ ว่าเป็นคำแนะนำของคุณมาถ้ามันเสร็จแล้วคุณสามารถเชื่อมโยงในคำตอบของคุณข้างต้น?)
Zearin

9
@AlexisHuet ความคิดเห็นประเภทนี้จะดีกว่าหากมีลิงก์ไปยังความคิดเห็นด้านล่าง (ซึ่งคุณสามารถรับได้จากshareปุ่ม)
erikbwork

2
คุณควรอัปเดตคำตอบเพื่อพูดถึงที่distributeรวมกันเมื่อไม่นานมาsetuptoolsนี้ ความจริงที่ว่าข้อมูลจำนวนมากที่ล้าสมัยทำให้เกิดความสับสน
Amro

5

หมายเหตุ: คำตอบที่เลิกใช้จำหน่ายตอนนี้ล้าสมัย คำตอบนี้ไม่ถูกต้องอีกต่อไปเนื่องจาก Python Packaging Authority ได้ถูกก่อตั้งขึ้นและได้ทำการล้างข้อมูลจำนวนมาก


ใช่คุณได้รับมัน : - ฉันคิดว่าในเวลานี้แพ็คเกจที่ต้องการคือDistributeซึ่งเป็นทางแยกของ setuptools ซึ่งเป็นส่วนเสริมของ distutils (ระบบบรรจุภัณฑ์ดั้งเดิม) Setuptools ไม่ได้รับการดูแลดังนั้นจึงถูกแยกและเปลี่ยนชื่ออย่างไรก็ตามเมื่อติดตั้งแล้วจะใช้ชื่อแพ็คเกจของ setuptools! ฉันคิดว่านักพัฒนางูหลามส่วนใหญ่ใช้ดิสทริบิวเตอร์แล้วและฉันก็สามารถบอกได้อย่างแน่นอน


สำหรับบันทึกฉันยอมรับคำตอบนี้เพราะมันบอกฉันว่าสถานการณ์ตอนนี้ (และแยกคือการขยายความสัมพันธ์ที่ภาพในคำตอบอื่น ๆ ก็ไม่ได้พูดถึง) และบางแห่งตามทางที่ฉันได้เรียนรู้ว่าเอกสารเองมักจะไม่แน่ใจว่าสิ่งที่พยายามจะพูด
VPeric

2
@VPeric แท้จริงแล้วเอกสารดังกล่าวสะท้อนให้เห็นถึงความจริงที่ว่าลักษณะของ python นี้อยู่ในสถานะของฟลักซ์ / ระเบียบ
juanchopanza

2

ฉันรู้ว่าฉันได้ตอบคำถามที่สองของคุณโดยไม่ต้องระบุข้อสมมติฐานที่ไม่แน่นอนในปัญหาดั้งเดิมของคุณ:

ฉันพยายามพอร์ตไลบรารีโอเพนซอร์ซ (SymPy ถ้าใครสงสัย) กับ Python 3 ในการทำเช่นนี้ฉันต้องรัน 2to3 โดยอัตโนมัติเมื่อสร้าง Python 3

คุณอาจไม่จำเป็น กลยุทธ์อื่น ๆ มีการอธิบายไว้ที่http://docs.python.org/dev/howto/pyporting

ในการทำเช่นนั้นฉันต้องใช้การแจกจ่าย

คุณสามารถ :) distutils รองรับการแปลง 2to3 แบบ build-time สำหรับรหัส (ไม่ใช่ docstrings) ในลักษณะที่แตกต่างกันของการแจกจ่าย: http://docs.python.org/dev/howto/pyporting#during-installation


ขอบคุณแม้ว่าเราได้ตัดสินใจแก้ไขปัญหานี้แล้วด้วยการเขียนสคริปต์เพื่อจัดการกับการแปลง และใช่ฉันรู้ว่ามีตัวเลือกอื่นนอกเหนือจากการใช้ 2to3 แต่ SymPy เป็น codebase ที่ซับซ้อน (ประมาณ 200k บรรทัด + ครั้งสุดท้ายที่ฉันตรวจสอบ) และการใช้ 2to3 เป็นกลยุทธ์ที่เหมือนจริงเท่านั้น ขอขอบคุณอีกครั้งในกรณีใด ๆ !
VPeric

2

อัปเดตคำถามนี้ในปลายปี 2014 ที่โชคดีที่ Python บรรจุภัณฑ์วุ่นวายได้รับการทำความสะอาดอย่างมากโดยผู้จัดการแพคเกจ " conda " ของ Continuum

โดยเฉพาะอย่างยิ่ง CONDA ได้อย่างรวดเร็วช่วยให้การสร้าง CONDA ว่า " สภาพแวดล้อม " คุณสามารถกำหนดค่าสภาพแวดล้อมด้วย Python เวอร์ชันต่าง ๆ ตัวอย่างเช่น:

conda create -n py34 python=3.4 anaconda

conda create -n py26 python=2.6 anaconda

จะสร้างสภาพแวดล้อม Python สอง ("py34" หรือ "py26") ด้วย Python เวอร์ชันอื่น

หลังจากนั้นคุณสามารถเรียกใช้สภาพแวดล้อมด้วย Python เวอร์ชันเฉพาะด้วย:

source activate <env name>

ดูเหมือนว่าคุณสมบัตินี้มีประโยชน์อย่างยิ่งในกรณีของคุณซึ่งคุณต้องจัดการกับ Python เวอร์ชันอื่น

ยิ่งกว่านั้น conda มีคุณสมบัติดังต่อไปนี้:

  • Python ผู้ไม่เชื่อเรื่องพระเจ้า
  • ข้ามแพลตฟอร์ม
  • ไม่ต้องใช้สิทธิ์ผู้ดูแลระบบ
  • การจัดการการพึ่งพาสมาร์ท (โดยวิธีแก้ SAT)
  • จัดการกับ C, Fortran และไลบรารี่ระดับระบบที่คุณอาจต้องเชื่อมโยง

จุดสุดท้ายนั้นสำคัญอย่างยิ่งหากคุณอยู่ในวงการคำนวณทางวิทยาศาสตร์

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