“ การติดตั้ง pip - แก้ไขได้.”” vs“ python setup.py พัฒนา”


178

มีความแตกต่างอย่างมีนัยสำคัญระหว่าง

pip install -e /path/to/mypackage

และตัวแปร setuptools?

python /path/to/mypackage/setup.py develop

1
ดูเหมือนว่าจะเป็นลิงก์ที่อัปเดตซึ่งอธิบายโหมดการพัฒนา: setuptools.readthedocs.io/en/latest/…
PaulR

หากคุณมีความสนใจในการถอนการติดตั้ง (แพ็คเกจในโหมดพัฒนา / แก้ไขได้) ลองคำถามนี้: stackoverflow.com/questions/17346619/…
Charlie Parker

คำตอบ:


131

พยายามหลีกเลี่ยงการโทรsetup.pyโดยตรงจะไม่สามารถบอกได้ว่าคุณได้ติดตั้งแพ็คเกจของคุณอย่างถูกต้อง

ด้วยpip install -e:

สำหรับโครงการในท้องถิ่นไดเรกทอรี“ SomeProject.egg-info” จะถูกสร้างขึ้นโดยสัมพันธ์กับเส้นทางของโครงการ นี่เป็นข้อได้เปรียบอย่างหนึ่งของการใช้งานเพียงอย่างเดียว setup.py developซึ่งจะสร้าง“ ไข่ข้อมูล” ที่เกี่ยวข้องโดยตรงกับไดเรกทอรีการทำงานปัจจุบัน

เพิ่มเติม: เอกสาร

อ่านเอกสารของ setuptools ด้วย


ผู้ใช้ต้องเรียกใช้ 'python setup.py sdist' อีกครั้งหลังจากทำการเปลี่ยนแปลงไฟล์เพื่อให้การเปลี่ยนแปลงมีผล
ตัวแปร

แต่ถ้าคุณต้องการแก้ปัญหา (ไฟล์ setup.py ตัวเอง) ด้วย 'set_trace' แล้ว 'python setup.py พัฒนา' ทำให้มันเป็นไปได้
mirek

URL ที่สองเสีย
bad_coder

ทั้งสองทำงานให้ฉัน
sobolevn

76

ข้อแตกต่างอีกประการหนึ่ง: pip install -eใช้ล้อขณะที่ python setup.py develop
ไม่ได้ใช้

ด้วยinstallคุณสามารถบรรลุพฤติกรรมเดียวกันโดยใช้
pip install -e /path/to/package --no-use-wheel

ข้อมูลเพิ่มเติมเกี่ยวกับล้อ: ล้อหลาม


18
โปรดทราบว่าตามpip.pypa.io/en/stable/reference/pip_install ระบุว่า เลิกใช้--no-use-wheelงานแล้ว--no-binary :all:
Nzbuu

เราสามารถทำการ pip install -e สำหรับแพ็คเกจที่สร้างโดยใช้ sdist ได้ไหม?
ตัวแปร

36

ความแตกต่างที่อาจเข้าข้างอีกpip install -eคือว่าถ้าโครงการของคุณมีการอ้างอิงในinstall_requiresในsetup.pyแล้วpip install -e .ติดตั้งการอ้างอิงกับ pip ในขณะที่python setup.py developสามารถทำการติดตั้งeasy_installและอาจทำให้เกิดปัญหาอีกครั้ง: 'ไข่ข้อมูล' ดังกล่าวข้างต้น เมื่อinstall-requiresใช้dependency_linksกับ URL git ที่กำหนดเองพร้อมตัวระบุไข่ที่แนบมานี้อาจเป็นเรื่องที่น่ารำคาญเป็นพิเศษ


1
ทั้งหมดนี้อธิบายว่าทำไมแพ็คเกจส่วนตัวของฉันจึงล้มเหลวในการติดตั้ง มันอยู่บนเซิร์ฟเวอร์ devpi ของฉันไม่ใช่ pypi ขอบคุณ
ckot

เมื่อคุณบอกว่าแพ็กเกจสามารถแก้ไขได้คุณหมายถึงผู้ใช้จะต้องเรียกใช้ 'python setup.py sdist' อีกครั้งหลังจากทำการเปลี่ยนแปลงไฟล์แพ็คเกจหรือไม่? หรือเรียกใช้คำสั่งข้างต้นไม่จำเป็นต้อง?
ตัวแปร

@ แปรปรวนเมื่อคุณติดตั้งแพ็คเกจโลคัลด้วยpip install -e .จะทำให้ symlink ในไดเรกทอรี Python site-packages ไดเรกทอรีที่เกี่ยวข้องชี้ไปที่สำเนาการทำงานของคุณ เมื่อมีการเปลี่ยนแปลงรหัสในสำเนาการทำงานนั้นจะมีผลทันทีในรุ่น "ติดตั้ง" ดังนั้นคุณไม่จำเป็นต้องเรียกใช้คำสั่งการติดตั้งใหม่ตามที่คุณไป นี้จะเป็นประโยชน์มากที่สุดสำหรับการพัฒนาในพื้นที่เก็บข้อมูลที่แสดงถึงแพคเกจติดตั้งได้ แต่ยังสามารถเป็นประโยชน์สำหรับการเขียนเช่นคอลเลกชันของโมดูลบางคนที่มีการนำเข้าที่แน่นอนเท่านั้น ฯลฯ
ely

0

อีกข้อแตกต่าง: เมื่อคุณเรียกใช้python setup.py developรุ่นที่ถือว่าเป็นรุ่นก่อนวางจำหน่าย (อาจเป็นเพราะคุณเรียกใช้จากโคลน git เมื่อไม่ได้ตรวจสอบรุ่น) คุณจะเปิดใช้งานการติดตั้งรุ่นก่อนวางจำหน่ายของการอ้างอิงของคุณ . ในอีกทางหนึ่งด้วยpip install --editableคุณจะต้องผ่าน--preอย่างชัดเจนหากคุณต้องการเผยแพร่ล่วงหน้าเหล่านี้

(ดูบันทึก CI ที่มีการเผยแพร่ล่วงหน้าโดยไม่ได้ตั้งใจใช้และเปรียบเทียบกับการสร้างถาวรที่นี่ )

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