ฉันจะติดตั้งจากแคชในพื้นที่ที่มี pip ได้อย่างไร


142

ฉันติดตั้งแพ็คเกจเดียวกันจำนวนมากในสภาพแวดล้อมvirtualenv ที่แตกต่างกัน มีวิธีที่ฉันสามารถดาวน์โหลดแพ็คเกจหนึ่งครั้งแล้วติดตั้งpipจากแคชในเครื่องหรือไม่?

สิ่งนี้จะลดแบนด์วิดท์และเวลาในการดาวน์โหลด


1
โปรดทราบว่าตั้งแต่ pip 6.0 (2014-12-22) pip จะแคชตามค่าเริ่มต้น ดูpip.pypa.io/en/stable/reference/pip_install.html#cachingเพื่อดูรายละเอียด
Pi Delport

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

คำตอบ:


125

อัปเดตคำตอบ 19-Nov-15

ตามเอกสาร Pip :

เริ่มต้นด้วย v6.0, pip จัดเตรียมแคชตามค่าเริ่มต้นซึ่งทำงานคล้ายกับเว็บเบราว์เซอร์ ในขณะที่แคชเปิดอยู่ตามค่าเริ่มต้นและได้รับการออกแบบให้ทำสิ่งที่ถูกต้องโดยค่าเริ่มต้นคุณสามารถปิดใช้งานแคชและเข้าถึง PyPI ได้ตลอดเวลาโดยใช้--no-cache-dirตัวเลือก

ดังนั้นคำตอบที่อัพเดตคือใช้ pip กับค่าเริ่มต้นหากคุณต้องการแคชดาวน์โหลด

คำตอบเดิม

จากข่าว pipเวอร์ชั่น 0.1.4:

เพิ่มการสนับสนุนสำหรับตัวแปรด้านสิ่งแวดล้อม $ PIP_DOWNLOAD_CACHE ซึ่งจะแคชการดาวน์โหลดแพคเกจดังนั้นการติดตั้งในอนาคตไม่จำเป็นต้องดาวน์โหลดขนาดใหญ่ ยังต้องมีการเข้าถึงเครือข่าย แต่จะมีการหลีกเลี่ยงการดาวน์โหลดเพียงบางส่วนเมื่อใช้สิ่งนี้

เพื่อใช้ประโยชน์จากสิ่งนี้ฉันได้เพิ่มสิ่งต่อไปนี้ในของฉัน~/.bash_profile:

export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache

หรือถ้าคุณใช้ Mac:

export PIP_DOWNLOAD_CACHE=$HOME/Library/Caches/pip-downloads

หมายเหตุ

  1. หากตรวจพบแพ็คเกจรุ่นที่ใหม่กว่าจะมีการดาวน์โหลดและเพิ่มลงในPIP_DOWNLOAD_CACHEไดเรกทอรี เช่นตอนนี้ฉันมีแพ็คเกจ Django ค่อนข้างน้อย
  2. สิ่งนี้ไม่ได้ลบความจำเป็นในการเข้าถึงเครือข่ายตามที่ระบุไว้ในข่าว pipดังนั้นจึงไม่ใช่คำตอบสำหรับการสร้างสิ่งใหม่virtualenvsบนเครื่องบิน แต่ก็ยังยอดเยี่ยม

4
อาจเป็นความคิดที่ดีกว่าคือใส่ไว้ใน. bashrc เนื่องจาก bash_profile จะถูกเรียกใช้งานระหว่างการเข้าสู่ระบบเท่านั้น นั่นขึ้นอยู่กับคุณแล้วล่ะค่ะและมันเป็นคำแนะนำที่ดี :)
Nikita Hismatov

1
บน mac นั้นจะถูกโหลดที่จุดเริ่มต้นของเชลล์ใด ๆ
saul.shanabrook

3
PIP_DOWNLOAD_CACHE มีข้อบกพร่องอย่างจริงจังและฉันจะไม่แนะนำให้ใช้กับสิ่งต่าง ๆ เช่นการนำแพคเกจไปยังเครื่องปรับใช้ของคุณ นอกจากนี้ยังต้องอาศัย pypi.python.org ที่สามารถเข้าถึงได้ เหมาะสำหรับแคชการพัฒนาในท้องถิ่น แต่ไม่เหมาะสำหรับการใช้งานที่หนักกว่า
slacy

1
@slacy คุณสามารถแสดงความคิดเห็นเกี่ยวกับสาเหตุที่ทำให้เกิดข้อบกพร่องอย่างจริงจังได้หรือไม่ หากคุณไม่ต้องการให้ PyPI เข้าถึงได้นั่นคือสิ่งที่ไม่มีดัชนีสำหรับ แคชดาวน์โหลดเป็นมุมฉากเพื่อเข้าถึง PyPI หรือไม่!
lvh

@lvh คำตอบ slacy ด้านล่างอธิบายว่าทำไมแคชดาวน์โหลด Pip เป็นข้อบกพร่อง ฉันเคยเห็นการติดตั้ง pip ใช้เวลานานขึ้นด้วยการเปิดใช้งานแคชแปลก ๆ pip-accelและตระกร้าดูเหมือนจะเป็นตัวเลือกที่ดีกว่า
qris

52

ในความคิดของฉันpip2piมันเป็นทางออกที่สง่างามและน่าเชื่อถือสำหรับปัญหานี้

จากเอกสาร:

pip2pi สร้างที่เก็บแพคเกจที่เข้ากันได้กับ PyPI จากข้อกำหนดของ pip

pip2pi ช่วยให้คุณสร้างดัชนี PyPI ของคุณเองโดยใช้คำสั่งง่ายๆสองคำสั่ง:

  1. ในการทำมิเรอร์แพ็คเกจและข้อกำหนดทั้งหมดให้ใช้pip2tgz:

    $ cd /tmp/; mkdir package/
    $ pip2tgz packages/ httpie==0.2
    ...
    $ ls packages/
    Pygments-1.5.tar.gz
    httpie-0.2.0.tar.gz
    requests-0.14.0.tar.gz
    
  2. ในการสร้างดัชนีแพ็คเกจจากไดเรกทอรีก่อนหน้า:

    $ ls packages/
    bar-0.8.tar.gz
    baz-0.3.tar.gz
    foo-1.2.tar.gz
    $ dir2pi packages/
    $ find packages/
    /httpie-0.2.0.tar.gz
    /Pygments-1.5.tar.gz
    /requests-0.14.0.tar.gz
    /simple
    /simple/httpie
    /simple/httpie/httpie-0.2.0.tar.gz
    /simple/Pygments
    /simple/Pygments/Pygments-1.5.tar.gz
    /simple/requests
    /simple/requests/requests-0.14.0.tar.gz
    
  3. ในการติดตั้งจากดัชนีที่คุณสร้างในขั้นตอนที่ 2 คุณสามารถใช้:

    pip install --index-url=file:///tmp/packages/simple/ httpie==0.2
    

pip2piคุณยังสามารถสะท้อนดัชนีของคุณเองไปยังโฮสต์ระยะไกลด้วย


+1 pip2pip ใช้งานได้ดี !! ฉันไม่ชอบการเชื่อมต่อเครือข่ายที่มาก มันล้มเหลวเมื่อคุณต้องการมันมากที่สุด
MGP

มันใช้งานได้ดีมันตอบคำถามของฉันstackoverflow.com/questions/18052217/… , yon สามารถตอบได้หรือไม่?
Larry Cai

1
บางทีมันอาจจะบอกเป็นนัย แต่มันก็คุ้มค่าที่จะกล่าวถึงอย่างชัดเจน: pip2tgzตรวจสอบว่าคุณได้ดาวน์โหลดแพคเกจไปยังไดเรกทอรีที่กำหนดไว้แล้วดังนั้นหากคุณเรียกใช้บรรทัดการติดตั้งเดียวกันหรือหลายบรรทัดการติดตั้งที่มีการทับซ้อนกัน
clacke

32

สำหรับ Pip เวอร์ชั่นที่ใหม่กว่า:

รุ่น Pip ที่ใหม่กว่าตอนนี้แคชดาวน์โหลดตามค่าเริ่มต้น ดูเอกสารนี้:

https://pip.pypa.io/en/stable/reference/pip_install/#caching

สำหรับ Pip รุ่นเก่า:

สร้างชื่อไฟล์กำหนดค่า~/.pip/pip.confและเพิ่มเนื้อหาต่อไปนี้:

[global]
download_cache = ~/.cache/pip

บน OS X จะมีเส้นทางที่ดีกว่าในการเลือก~/Library/Caches/pipเนื่องจากเป็นไปตามข้อกำหนดของโปรแกรม OS X อื่น ๆ ที่ใช้


และถ้าฉันต้องการจัดเก็บไว้ทั่วโลกเพื่อให้ผู้ใช้อื่น ๆ ของพีซีเครื่องเดียวกันสามารถเข้าถึงได้ ฉันจะทำอย่างไร ฉันคิดว่าไฟล์กำหนดค่าจะต้องอยู่ใน/ etcหรืออะไร
Batandwa

@batandwa: นั่นอาจใช้ได้ หากไม่เป็นเช่นนั้นคุณสามารถลองทำสิ่งนี้: ตรวจสอบให้แน่ใจว่าผู้ใช้ทุกคนมีpip.confการdownload_cacheตั้งค่าที่ชี้ไปยังไดเรกทอรีทั้งระบบเดียวกัน
Flimm

28

PIP_DOWNLOAD_CACHE มีปัญหาร้ายแรงบางอย่าง สิ่งสำคัญที่สุดคือมันเข้ารหัสชื่อโฮสต์ของการดาวน์โหลดลงในแคชดังนั้นการใช้มิเรอร์จึงเป็นไปไม่ได้

วิธีที่ดีกว่าในการจัดการแคชของการดาวน์โหลด pip คือการแยกขั้นตอน "ดาวน์โหลดแพ็คเกจ" ออกจากขั้นตอน "ติดตั้งแพ็คเกจ" โดยทั่วไปไฟล์ที่ดาวน์โหลดนั้นจะเรียกว่า "sdist files" (ดิสทริบิวชันต้นฉบับ) และฉันจะเก็บไฟล์ไว้ในไดเรกทอรี $ SDIST_CACHE

ทั้งสองขั้นตอนจบลงด้วยการเป็น:

pip install --no-install --use-mirrors -I --download=$SDIST_CACHE <package name>

ซึ่งจะดาวน์โหลดแพ็คเกจและวางไว้ในไดเรกทอรีที่ชี้ไปโดย $ SDIST_CACHE มันจะไม่ติดตั้งแพคเกจ จากนั้นคุณรัน:

pip install --find-links=file://$SDIST_CACHE --no-index --index-url=file:///dev/null <package name> 

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


Gabriel - ไม่ได้ดาวน์โหลดสองครั้งเพียงครั้งเดียวในขั้นตอนแรกจากนั้นติดตั้งจากแคชในเครื่องในครั้งที่สอง คุณเห็นอะไร
slacy

ถ้าฉันรันขั้นตอนแรกสองครั้งมันจะดาวน์โหลดสองครั้งใช่มั้ย อย่างน้อยก็เกิดขึ้นที่นี่ ฉันจะต้องรู้ว่าขั้นตอนแรกได้รับการดำเนินการสำหรับแพคเกจนี้อย่างน้อยหนึ่งครั้งก่อนที่จะดำเนินการมิฉะนั้นมันจะดาวน์โหลดไฟล์เดียวกันสองครั้ง ฉันจะตรวจสอบได้อย่างไรว่าฉันจำเป็นต้องเรียกใช้งานหรือดาวน์โหลดมาก่อนหรือไม่
Gabriel Jordão

คุณอาจต้องการใช้ pip2pi ตามที่คำตอบอื่น ๆ แนะนำ :)
slacy

ดาวน์โหลดนี้อ้างอิงเช่นกันหรือไม่
monkut

ฉันใช้ pip 18.1 และตัวเลือก - ไม่มีการติดตั้งอยู่ มีความคิดเห็นเกี่ยวกับวิธีอัปเดตคำตอบนี้ไหม?
paolof89

13

เริ่มต้นในรุ่น 6.0 , pipตอนนี้ไม่ได้เป็นของตัวเองแคช:

  • DEPRECATION pip install --download-cacheและpip wheel --download-cacheแฟล็กบรรทัดคำสั่งเลิกใช้แล้วและฟังก์ชันการทำงานถูกลบ เนื่องจากตอนนี้ pip กำหนดค่าโดยอัตโนมัติและใช้เป็นแคช HTTP ภายในซึ่งแทนที่--download-cacheตัวเลือกที่มีอยู่แล้วซึ่งไม่ได้ทำงาน แต่จะยังคงได้รับการยอมรับจนกว่าจะลบออกใน pip v8.0 สำหรับข้อมูลเพิ่มเติมโปรดดูhttps://pip.pypa.io/en/latest/reference/pip_install.html#caching

ข้อมูลเพิ่มเติมจากลิงค์ด้านบน :

เริ่มต้นด้วย v6.0, pip จัดเตรียมแคชตามค่าเริ่มต้นซึ่งทำงานคล้ายกับเว็บเบราว์เซอร์ ในขณะที่แคชเปิดอยู่ตามค่าเริ่มต้นและได้รับการออกแบบให้ทำสิ่งที่ถูกต้องโดยค่าเริ่มต้นคุณสามารถปิดใช้งานแคชและเข้าถึง PyPI ได้ตลอดเวลาโดยใช้--no-cache-dirตัวเลือก


9

pip wheelเป็นตัวเลือกที่ยอดเยี่ยมที่ทำในสิ่งที่คุณต้องการด้วยคุณสมบัติพิเศษในการรวบรวมแพ็คเกจล่วงหน้า จากเอกสารอย่างเป็นทางการ :

สร้างล้อสำหรับความต้องการ (และการอ้างอิงทั้งหมด):

$ pip wheel --wheel-dir=/tmp/wheelhouse SomePackage

ตอนนี้/tmp/wheelhouseไดเรกทอรีของคุณมีการอ้างอิงทั้งหมดของคุณล่วงหน้าแล้วดังนั้นคุณสามารถคัดลอกโฟลเดอร์ไปยังเซิร์ฟเวอร์อื่นและติดตั้งทุกอย่างด้วยคำสั่งนี้:

$ pip install --no-index --find-links=/tmp/wheelhouse SomePackage

โปรดทราบว่าแพคเกจทั้งหมดจะไม่สามารถพกพาได้อย่างสมบูรณ์ในเครื่อง แพคเกจบางอย่างจะถูกสร้างขึ้นเป็นพิเศษสำหรับเวอร์ชั่น Python, การกระจาย OS และ / หรือสถาปัตยกรรมฮาร์ดแวร์ที่คุณใช้ จะถูกระบุในชื่อไฟล์เช่น-cp27-none-linux_x86_64สำหรับ CPython 2.7 บน Linux 64 บิตเป็นต้น


3

ใช้ pip เท่านั้น (เวอร์ชั่นของฉันคือ 1.2.1) คุณยังสามารถสร้างที่เก็บข้อมูลภายในเช่นนี้:

if ! pip install --find-links="file://$PIP_SDIST_INDEX" --no-index <package>; then
    pip install --download-directory="$PIP_SDIST_INDEX" <package>
    pip install --find-links="file://$PIP_SDIST_INDEX" --no-index <package>
fi

ในการเรียก pip ครั้งแรกแพ็คเกจจากไฟล์ข้อกำหนดจะถูกค้นหาในที่เก็บโลคัล (เท่านั้น) จากนั้นติดตั้งจากที่นั่น หากล้มเหลว pip จะดึงแพ็คเกจจากตำแหน่งปกติ (เช่น PyPI) และดาวน์โหลดไปยังPIP_SDIST_INDEX(แต่ไม่ได้ติดตั้งอะไร!) สายแรกคือ "ซ้ำ" เพื่อติดตั้งแพคเกจจากดัชนีท้องถิ่น

( --download-cacheสร้างชื่อไฟล์ท้องถิ่นซึ่งเป็นฉบับสมบูรณ์ (หนี) URL และ pip ไม่สามารถใช้เป็นดัชนีที่มี--find-links. --download-cacheจะใช้ไฟล์ที่เก็บไว้หากพบ. เราสามารถเพิ่มตัวเลือกนี้ไปยังสายที่สองของ pip แต่เนื่องจากดัชนี ฟังก์ชั่นแล้วเป็นแคชชนิดหนึ่งซึ่งไม่จำเป็นต้องนำมามากมันจะช่วยถ้าดัชนีของคุณถูกทำให้ว่างเปล่า)


3

มีวิธีแก้ไขปัญหาใหม่สำหรับสิ่งนี้เรียกว่าpip-accelซึ่งเป็นการแทนที่แบบแทนที่สำหรับการpipแคชในตัว

โปรแกรม pip-accel เป็น wrapper ของ pip ซึ่งเป็น Python package manager มันเร่งการใช้ pip เพื่อเริ่มต้นสภาพแวดล้อมเสมือน Python ที่กำหนดตั้งแต่หนึ่งไฟล์ความต้องการ มันทำได้โดยการรวมสองวิธีต่อไปนี้:

  • การดาวน์โหลดการกระจายแหล่งที่มาจะถูกแคชและใช้เพื่อสร้างดัชนีโลคัลของไฟล์เก็บถาวรการกระจายต้นฉบับ

  • การแจกแจงแบบไบนารีจะใช้เพื่อเพิ่มความเร็วในกระบวนการติดตั้งการอ้างอิงกับคอมโพเนนต์ไบนารี (เช่น M2Crypto และ LXML) แทนที่จะคอมไพล์การอ้างอิงเหล่านี้อีกครั้งสำหรับสภาพแวดล้อมเสมือนจริงทุกครั้งที่เรารวบรวมพวกมันหนึ่งครั้งและแคชผลลัพธ์เป็นการกระจายแบบไบนารี่ * .tar.gz

Paylogic ใช้ pip-accel เพื่อเริ่มต้นสภาพแวดล้อมเสมือนจริงอย่างรวดเร็วและเชื่อถือได้ในฟาร์มของพวกมันที่รวมทาสอย่างต่อเนื่องซึ่งกำลังทำการทดสอบหน่วยอยู่ตลอดเวลา เรายังใช้มันในการสร้างเซิร์ฟเวอร์ของเรา

เราได้มองเห็นได้รอบ 10x speedup จากการเปลี่ยนจากการpippip-accel


2

basketตัวเลือกที่ง่ายคือ

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

จากนั้นคุณสามารถใช้ไดเรกทอรีนี้เป็นแหล่งข้อมูลสำหรับpip:

pip install --no-index -f file:///path/to/basket package

หรือeasy_install:

easy_install -f ~/path/to/basket -H None package

คุณยังสามารถใช้เพื่ออัปเดตตระกร้าเมื่อใดก็ตามที่คุณออนไลน์


ข้อ จำกัด (จากหน้าเว็บอย่างเป็นทางการ): การแจกแจงแหล่งที่มาของตะกร้าดาวน์โหลดเท่านั้นไม่สามารถดาวน์โหลดแพ็คเกจที่ไม่ได้โฮสต์บน PyPI และจะละเว้นข้อกำหนดรุ่น (เช่น "nose> = 1.1.2") ดาวน์โหลดรุ่นล่าสุดเสมอ
hdiogenes

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