Pip vs Package Manager สำหรับจัดการแพ็กเกจ Python


20

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

อย่างไรก็ตามเนื่องจากนี่เป็นวิธีการติดตั้งที่ไม่สอดคล้องกันจะดีกว่าหรือไม่ที่จะใช้ pip เพียงอย่างเดียว? ประโยชน์ / ผู้ว่าการใช้ pip บนที่เก็บของระบบสำหรับแพ็คเกจที่มีอยู่ในทั้งสองแห่งคืออะไร

ลิงก์ที่ฉันรวมถึงรัฐ

ข้อได้เปรียบของการใช้แพ็คเกจ Debian / NeuroDebian มาตรฐานอยู่เสมอคือแพคเกจนั้นได้รับการทดสอบอย่างรอบคอบเพื่อให้เข้ากันได้ แพ็คเกจ Debian บันทึกการอ้างอิงกับไลบรารีอื่น ๆ ดังนั้นคุณจะได้รับไลบรารีที่คุณต้องการเป็นส่วนหนึ่งของการติดตั้งเสมอ

ฉันใช้ซุ้มประตู เป็นกรณีนี้กับระบบการจัดการแพคเกจอื่น ๆ นอกจากฉลาด?

คำตอบ:


21

ข้อเสียที่ใหญ่ที่สุดที่ฉันเห็นเมื่อใช้pipเพื่อติดตั้งโมดูล Python บนระบบของคุณไม่ว่าจะเป็นโมดูลระบบหรือโมดูลผู้ใช้ก็คือระบบการจัดการแพ็คเกจของการแจกจ่ายของคุณจะไม่รู้จักพวกเขา ซึ่งหมายความว่าจะไม่ใช้กับแพ็คเกจอื่นที่ต้องการและคุณอาจต้องการติดตั้งในอนาคต (หรืออาจเริ่มใช้หนึ่งในโมดูลเหล่านั้นหลังจากการอัพเกรด); จากนั้นคุณจะจบลงด้วยpipโมดูลทั้งสองและเวอร์ชันที่มีการจัดการการกระจายซึ่งอาจทำให้เกิดปัญหา (ฉันพบเจออินสแตนซ์อื่นของเมื่อเร็ว ๆ นี้) ดังนั้นคำถามของคุณปลายขึ้นเป็นเรื่องทั้งหมดหรือไม่มีอะไร: ถ้าคุณเพียงใช้pip สำหรับโมดูล Python คุณจะไม่สามารถใช้ตัวจัดการแพคเกจการแจกจ่ายของคุณได้อีกต่อไปสำหรับสิ่งที่ต้องการใช้โมดูล Python ...

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

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


1
ความจริงที่ว่าเราติดอยู่กับขั้วสองขั้วหรือความขัดแย้งนี้เป็นเรื่องที่โชคร้ายบางทีเราควรจะแก้ปัญหานี้ใน Python และ repos อย่างเป็นทางการ
แมว

ความเสี่ยงที่ฉันเห็นเมื่อไม่ได้ใช้งานpipจะเป็นอย่างไรถ้าคุณบังเอิญpip uninstallมีแพ็คเกจที่จัดการโดยdistro?
Mehrdad

@ Mehrdad ในกรณีส่วนใหญ่ที่คุณเรียกใช้pipในฐานะผู้ใช้ (ร่วมกับ virtualenv) และดังนั้นคุณไม่ได้รับอนุญาตให้ยุ่งกับไฟล์ที่ติดตั้งระบบ
marcelm

1
@marcelm: ฉันเดาว่าคุณเป็นเครื่อง Linux และมีคนสอนให้คุณไม่ใช้sudo pipแล้วอาจจะ (แม้ว่าถึงตอนนั้นคุณก็สมมติว่ามันมากเกินไปเมื่อคุณคิดว่าทุกคนใช้virtualenv) แต่ตัวอย่างเช่นฉันใช้ MSYS2 (Windows) ในกรณีที่ไม่สามารถใช้ได้ ฉันมีสองตัวเลือกสำหรับการติดตั้งแพคเกจหลาม: และpacman pipฉันต้องจำไว้ซึ่งจะใช้ในการติดตั้งอะไรเพราะใช้ผิดที่จะถอนการติดตั้งจะกรูขึ้น
Mehrdad

10

TL; DR

  • ใช้pip(+ virtualenv) สำหรับสิ่งของ (libs, frameworks, บางทีเครื่องมือ dev) โครงการของคุณ (ที่คุณพัฒนา) ใช้
  • ใช้ตัวจัดการแพ็คเกจสำหรับแอปพลิเคชันที่คุณใช้ (ในฐานะผู้ใช้ปลายทาง)

การพัฒนาที่พึ่งพา

หากคุณกำลังพัฒนาซอฟต์แวร์ใน Python คุณจะต้องใช้pipสำหรับการอ้างอิงทั้งหมดของโครงการไม่ว่าจะเป็นการอ้างอิงแบบรันไทม์การอ้างอิงแบบบิลด์หรือสิ่งที่จำเป็นสำหรับการทดสอบอัตโนมัติและการตรวจสอบการปฏิบัติตามกฎอัตโนมัติ (linter, ตัวตรวจสอบสไตล์ ... )

มีหลายเหตุผลนี้:

  • สิ่งนี้ช่วยให้คุณใช้virtualenv (โดยตรงหรือผ่าน virtualenvwrapper หรือ pipenv หรือวิธีอื่น ๆ ) เพื่อแยกการพึ่งพาของโครงการต่าง ๆ จากกันและกันและเพื่อแยกแอปพลิเคชั่นหลามที่คุณใช้ "ในการผลิต" (เป็นผู้ใช้) จาก shenanigans แปลกใหม่ใด ๆ แม้กระทั่งความเข้ากันไม่ได้) ที่อาจเกิดขึ้นในการพัฒนา
  • สิ่งนี้อนุญาตให้คุณติดตามการอ้างอิงของโปรเจ็กต์ทั้งหมดในไฟล์requirements.txt(หากโปรเจ็กต์ของคุณเป็นแอพพลิเคชั่น) หรือsetup.py(หากโปรเจ็กต์ของคุณเป็นไลบรารีหรือเฟรมเวิร์ก) สิ่งนี้สามารถตรวจสอบได้ในการควบคุมการแก้ไข (เช่น Git) พร้อมกับซอร์สโค้ดเพื่อให้คุณรู้เสมอว่าเวอร์ชันใดของรหัสของคุณที่ต้องอาศัยเวอร์ชันที่อ้างอิงของคุณ
  • ข้างต้นช่วยให้นักพัฒนาอื่น ๆ สามารถทำงานร่วมกันในโครงการของคุณแม้ว่าพวกเขาจะไม่ใช้การกระจาย Linux เดียวกันหรือแม้กระทั่งระบบปฏิบัติการเดียวกัน (หากการพึ่งพาที่ใช้ยังมีอยู่ใน Mac และ Windows หรือสิ่งที่พวกเขาใช้)
  • คุณไม่ต้องการให้อัปเดตอัตโนมัติของตัวจัดการแพคเกจระบบปฏิบัติการของคุณทำลายรหัสของคุณ คุณควรอัปเดตการอ้างอิงของคุณ แต่คุณควรทำอย่างมีสติและในเวลาที่คุณเลือกเพื่อให้คุณพร้อมที่จะแก้ไขรหัสหรือย้อนกลับการอัปเดต (ซึ่งเป็นเรื่องง่ายถ้าคุณติดตามการประกาศการพึ่งพาทั้งหมดในระบบควบคุมการแก้ไขของคุณพร้อมกับรหัสของคุณ)

หากคุณรู้สึกว่าคุณจำเป็นต้องแยกการพึ่งพาโดยตรงและโดยอ้อม (หรือแยกความแตกต่างระหว่างช่วงเวอร์ชันที่ยอมรับได้สำหรับการอ้างอิงและเวอร์ชันจริงที่ใช้ cf. "version pinning") ดูที่ pip-tools และ / หรือ pipenv สิ่งนี้จะช่วยให้คุณสามารถแยกความแตกต่างระหว่างการสร้างและการทดสอบอ้างอิง (ความแตกต่างระหว่างการสร้างและการพึ่งพารันไทม์สามารถเข้ารหัสได้setup.py)

แอปพลิเคชันที่คุณใช้

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

หากสิ่งที่คุณต้องการไม่มีใน repo บรรจุภัณฑ์เริ่มต้นของคุณคุณสามารถดู repos บรรจุภัณฑ์เพิ่มเติม (เช่น launchpad ของ distros ตาม deb) หรือใช้pipต่อไป หากอย่างหลังใช้--userเพื่อติดตั้งลงในบ้านของผู้ใช้แทนที่จะเป็นระบบเพื่อให้คุณมีโอกาสน้อยที่จะทำลายการติดตั้ง Python ของคุณ (สำหรับสิ่งที่คุณต้องการเพียงชั่วคราวหรือไม่ค่อยคุณสามารถใช้ virtualenv ได้)


8

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

ในกล่อง dev ส่วนบุคคลของฉันฉันใช้ Pip ในผลิตภัณฑ์ที่ฉันใช้


4
สิ่งที่คุณใช้ควรขึ้นอยู่กับการตั้งค่าการผลิตของคุณด้วย Virtualenvs มีอยู่ด้วยเหตุผล :) นอกจากนี้ยังขึ้นอยู่กับ distro ของคุณการปรับปรุงความปลอดภัยอาจเป็นเหตุผลที่จะยึดติดกับ pip แทนเนื่องจากผู้จัดการแพคเกจอาจช้าในการเพิ่มเวอร์ชันใหม่
Edward Minnix

7

หากเรากำลังพูดถึงการติดตั้งแพ็กเกจหลามเพื่อใช้ในโค้ดที่คุณกำลังเขียนให้ใช้ pip

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

หากคุณวางแผนที่จะปล่อยรหัสไพ ธ อนใด ๆ โดยทั่วไปคุณจะต้องเพิ่ม a setup.pyหรือrequirements.txtโครงการของคุณซึ่งจะอนุญาตให้ pip ได้รับการอ้างอิงทั้งหมดโดยอัตโนมัติ ช่วยให้คุณสามารถสร้างหรือสร้างสภาพแวดล้อมเสมือนจริงสำหรับโครงการนั้นได้อย่างง่ายดาย


1

สรุป

มีสามหมวดหมู่ทั่วไปของโมดูลที่คุณติดต่อด้วย:

  1. โปรแกรมที่สนับสนุนเหล่านั้นได้รับการติดตั้งสำหรับผู้ใช้ทั้งหมดที่มีระบบแพ็กเกจระบบปฏิบัติการ (ซึ่งอาจรวมถึงเครื่องมือและไลบรารีที่ใช้โดยการเขียนโปรแกรมบุคคลใน Python ดูด้านล่าง) สำหรับสิ่งเหล่านี้คุณใช้แพ็กเกจระบบปฏิบัติการที่คุณสามารถทำได้และpipติดตั้งลงในไดเรกทอรีระบบที่จำเป็น
  2. โปรแกรมที่สนับสนุนเหล่านั้นติดตั้งโดยผู้ใช้เฉพาะสำหรับการใช้งานของเธอเองและสำหรับบางแง่มุมของการใช้ "วันต่อวัน" ของเธอในการใช้งาน Python เป็นภาษาสคริปต์ สำหรับสิ่งเหล่านี้เธอใช้pip --userอาจเป็นpyenvหรือpythonzและเครื่องมือและยุทธวิธีที่คล้ายกัน
  3. ผู้ที่สนับสนุนการพัฒนาและใช้งานแอพพลิเคชั่นเฉพาะ สำหรับสิ่งเหล่านี้คุณใช้virtualenv(หรือเครื่องมือที่คล้ายกัน)

แต่ละระดับที่นี่อาจได้รับการสนับสนุนจากระดับก่อนหน้า ตัวอย่างเช่นผู้ใช้ของเราใน (2) อาจพึ่งพาตัวแปลภาษา Python ที่ติดตั้งผ่านแพ็คเกจระบบปฏิบัติการ

ไปที่นี้ในรายละเอียดอีกเล็กน้อย:

โปรแกรมระบบและแพ็คเกจ

โปรแกรมที่เขียนด้วย Python ที่คุณต้องการ "เพียงแค่รัน" นั้นง่าย: เพียงใช้เครื่องมือติดตั้งระบบปฏิบัติการและให้พวกเขานำสิ่งที่พวกเขาต้องการ นี่ไม่ต่างจากโปรแกรมที่ไม่ใช่ Python สิ่งนี้มีแนวโน้มที่จะนำเครื่องมือ / ไลบรารี่ของ Python มาใช้ (เช่น Python interpreter!) ที่ผู้ใช้บนเครื่องของคุณอาจเริ่มพึ่งพา นี่ไม่ใช่ปัญหาตราบใดที่พวกเขาเข้าใจการพึ่งพาและโดยหลักแล้วรู้วิธีทางเลือกในการจัดการกับโฮสต์ที่ไม่ได้ให้การพึ่งพาเหล่านั้น

ตัวอย่างที่พบบ่อยและเรียบง่ายของการพึ่งพาดังกล่าวเป็นบางส่วนของสคริปส่วนตัวของฉันในการเริ่มต้นด้วย~/.local/bin/ #!/usr/bin/env pythonสิ่งเหล่านี้จะทำงานได้ดี (ตราบใดที่มันทำงานภายใต้ Python 2) บน RH / CentOS 7 และการติดตั้ง Ubuntu ส่วนใหญ่ (แต่ไม่ทั้งหมด) พวกเขาจะไม่อยู่ภายใต้การติดตั้ง Debian ขั้นพื้นฐานหรือบน Windows มากเท่าที่ฉันไม่ชอบสภาพแวดล้อมส่วนบุคคลของฉันมีมากในทางของการพึ่งพาแพคเกจระบบปฏิบัติการ (ฉันทำงานในระบบปฏิบัติการที่แตกต่างกันจำนวนมาก) สิ่งเช่นนี้ฉันพบว่าค่อนข้างยอมรับได้; แผนสำรองของฉันในโฮสต์หายากที่ไม่มีระบบ Python และไม่สามารถรับได้คือไปกับระบบผู้ใช้ตามที่อธิบายไว้ด้านล่าง

pip3คนที่ใช้ล่ามระบบหลามนอกจากนี้ยังจะขึ้นอยู่กับระบบ เกี่ยวกับที่ฉันมักจะวาดเส้นในการพึ่งพาระบบของฉัน ทุกอย่างจากvirtualenvข้างหน้าฉันจัดการกับตัวเอง (ตัวอย่างเช่นฉันสคริปต์เปิดใช้งานมาตรฐานอาศัยอยู่กับสิ่งที่pip3หรือpipอยู่ในเส้นทาง แต่ดาวน์โหลดสำเนาของตัวเองของvirtualenvบูตสภาพแวดล้อมเสมือนมันสร้าง

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

ผู้ใช้โปรแกรมและแพ็คเกจ "แบบวันต่อวัน"

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

โดยทั่วไปpip --userคือสิ่งที่ผู้คนจะใช้สำหรับสิ่งนี้แม้ว่าการพึ่งพาบางอย่างเช่นตัวแปล Python เองนั้นต้องการมากกว่านั้น pyenvและpythonzมีประโยชน์สำหรับการสร้างล่ามส่วนตัว (ไม่ว่าจะเป็นการติดตั้ง~/.local/binเพื่อเป็นล่ามเริ่มต้นหรืออื่น ๆ ) และแน่นอนว่าใคร ๆ ก็สามารถสร้าง "ด้วยมือ" จากแหล่งที่มาหากห้องสมุด dev พร้อมใช้งาน

ฉันพยายามเก็บชุดขั้นต่ำเปล่าไว้ที่นี่: virtualenvwrapper (เพราะฉันใช้มันตลอดเวลา) และอาจเป็น pip รุ่นล่าสุด ฉันพยายามหลีกเลี่ยงการพึ่งพานอกไลบรารีมาตรฐานหรือบน Python 3 สำหรับสคริปต์ส่วนบุคคลที่ฉันเขียนเพื่อใช้กับโฮสต์จำนวนมาก (แม้ว่าเราจะเห็นว่าฉันสามารถใช้เวลากับสิ่งนั้นได้นานเท่าไหร่ขณะที่ฉันย้ายสคริปต์ส่วนตัวเหล่านี้ไปยัง Python มากขึ้นเรื่อย ๆ )

การพัฒนาแอปพลิเคชันแยกต่างหากและสภาพแวดล้อมรันไทม์

นี่คือสิ่ง virtualenv ปกติ สำหรับการพัฒนาคุณควรใช้ virtualenv เกือบทุกครั้งเพื่อให้แน่ใจว่าคุณไม่ได้ใช้การพึ่งพาระบบหรือมักจะมากกว่าหนึ่งเพื่อทดสอบกับเวอร์ชัน Python ที่แตกต่างกัน

สภาพแวดล้อมเสมือนเหล่านี้ยังเหมาะสำหรับแอปพลิเคชันที่มีการพึ่งพาจำนวนมากซึ่งคุณต้องการหลีกเลี่ยงการสร้างมลพิษให้กับสภาพแวดล้อมผู้ใช้ของคุณ ตัวอย่างเช่นฉันมักจะตั้งค่า virtualenv สำหรับใช้งานJupyter notebooks และอื่น ๆ

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