pip เขียนทับแพ็คเกจที่ติดตั้งโดย apt-get หรือไม่?


9

จะเกิดอะไรขึ้นถ้าฉันบังเอิญpip installติดตั้งแพคเกจที่ฉันใช้apt-getไว้แล้วล่วงหน้า? ฉันเพิ่งจะใช้เวอร์ชันล่าสุด (เช่นอาจเป็นที่ฉันติดตั้งโดยใช้pip) จะเกิดอะไรขึ้นในทางกลับกัน?

หมายเหตุ: ฉันไม่ได้ใช้ Python ในสภาพแวดล้อมเสมือน (เพียงเพราะฉันไม่รู้ว่าทำไมฉันควร - ฉันใช้ Python เป็นเครื่องมือวิเคราะห์ข้อมูลและพยายามใช้ทุกอย่างเป็นเวอร์ชั่นล่าสุด)


ถ้าฉันไม่ผิดคุณไม่ได้ติดตั้งแพ็คเกจเดียวกันโดยใช้apt-getและpip
Lucio

ที่ถูกต้องpipติดตั้งพวกเขาใน/usr/localไดเรกทอรีย่อยโดยค่าเริ่มต้นหรือไดเรกทอรีอื่น ๆ ถ้าคุณต้องการ
Timo

3
แต่จะเกิดอะไรขึ้นเช่นถ้าฉันapt-get install python-pandasตามมาด้วยpip install pandasก่อนหรืออีกทางหนึ่ง การติดตั้ง python ทั่วโลกของฉันจะรู้ได้อย่างไรว่าทั้งสองรุ่นใช้อย่างไร
Fred S

1
@FredS: เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล Python จะค้นหาตามลำดับที่ระบุสำหรับโมดูล:python -c "import sys; print sys.path"
Timo

คำตอบ:


3

ตามที่ @Timo กล่าวไว้ในความคิดเห็นของเขาpython -c "import sys; print sys.path"จะให้เส้นทางการโหลดโมดูล Python สำหรับการติดตั้ง Python ของคุณ ในการติดตั้งที่ค่อนข้างใหม่ของ 16.04 มีบันทึกย่อสามไดเรกทอรี (ในจำนวนทั้งหมด 10 รายการที่อยู่ในเหมือง):

  • '' (ไดเรกทอรีของแอปพลิเคชัน)
  • '/usr/local/lib/python2.7/dist-packages' (ที่ pip ติดตั้งโมดูล)
  • '/usr/lib/python2.7/dist-packages' (โดยที่ apt ติดตั้งโมดูล)

อย่างไรก็ตามสิ่งสำคัญที่สุดที่ควรทราบคือ '/usr/local/lib/python2.7/dist-packages' มีความสำคัญสูงกว่า '/usr/lib/python2.7/dist-packages'

หากคุณติดตั้งแพ็กเกจ Python เป็นครั้งแรกผ่าน apt (-get) มันจะติดตั้งใน '/usr/lib/python2.7/dist-packages' หากคุณลองและใช้ pip เพื่อติดตั้งโมดูลในภายหลัง pip จะแจ้งเตือนว่าการพึ่งพานั้นเป็นไปตามที่กำหนดไว้แล้วจึงออก การเพิ่ม --upgrade flag จะบังคับให้ pip ติดตั้งติดตั้งโมดูลใน '/usr/local/lib/python2.7/dist-packages' (Notice การส่งออกที่ยังบอกว่ารุ่นใน '/usr/lib/python2.7/dist-packages' ไม่ได้ถอนการติดตั้ง) จากนั้นคุณสามารถตรวจสอบว่ารุ่น pip python -c "import MODULE; print MODULE.__file__"ติดตั้งเป็นหนึ่งถูกนำมาใช้โดยใช้ต่อไปนี้:

ดังนั้นสิ่งนี้แสดงให้เห็นว่าแพ็คเกจที่ติดตั้งผ่าน pip จะมีความสำคัญมากกว่าแพ็คเกจที่ติดตั้งระบบ แต่จะไม่เขียนทับสิ่งใดก็ตามที่ติดตั้งจาก apt (-get)


1

หากต้องการเพิ่ม @Bryan Wyatt ดูเหมือนว่าเป็นที่ต้องการ (และตั้งใจ) ว่ารายการ PIP ที่ติดตั้ง / อัพเกรดควรมีความสำคัญเหนือกว่าแพ็คเกจที่ติดตั้ง APT (เก่ากว่า) ระบบของฉันเปลี่ยนเส้นทางฉลาดและ pip มันควรจะเป็น (ละเว้นรายการอื่น ๆ ):

  • '/usr/local/lib/python2.7/dist-packages' (ที่ pip ติดตั้งโมดูล)
  • '/usr/lib/python2.7/dist-packages' (โดยที่ apt ติดตั้งโมดูล)

แต่เนื่องจากการกระทำที่ไม่รู้จักที่ฉันต้องทำเส้นทางเหล่านี้ปรากฏในลำดับที่ตรงกันข้ามสำหรับฉัน (ละเว้นรายการอื่น ๆ ):

  • '/usr/lib/python2.7/dist-packages' (โดยที่ apt ติดตั้งโมดูล)
  • '/usr/local/lib/python2.7/dist-packages' (ที่ pip ติดตั้งโมดูล)

แต่กลับกลายเป็นสิ่งที่ฉันไม่เพิ่มไป/usr/lib/python2.7/dist-packages /usr/local/lib/python2.7/dist-packages/easy-install.pthเพียงแค่ลบบรรทัดออกจากการeasy-install.pthแก้ไขความผิดพลาดให้ฉัน /usr/lib/python2.7/dist-packagesยังอยู่ในเส้นทางของฉันเนื่องจากมันจะถูกเพิ่มในระยะต่อไปที่อื่น

ในฐานะที่เป็นบันทึกด้านข้าง, pprint จะแสดงเส้นทางของคุณดีกว่า ... เช่น:

$ python -c "import sys; import pprint; pprint.pprint(sys.path)"
['',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.