ฉันติดตั้งแพ็คเกจเดียวกันจำนวนมากในสภาพแวดล้อมvirtualenv ที่แตกต่างกัน มีวิธีที่ฉันสามารถดาวน์โหลดแพ็คเกจหนึ่งครั้งแล้วติดตั้งpipจากแคชในเครื่องหรือไม่?
สิ่งนี้จะลดแบนด์วิดท์และเวลาในการดาวน์โหลด
ฉันติดตั้งแพ็คเกจเดียวกันจำนวนมากในสภาพแวดล้อมvirtualenv ที่แตกต่างกัน มีวิธีที่ฉันสามารถดาวน์โหลดแพ็คเกจหนึ่งครั้งแล้วติดตั้งpipจากแคชในเครื่องหรือไม่?
สิ่งนี้จะลดแบนด์วิดท์และเวลาในการดาวน์โหลด
คำตอบ:
ตามเอกสาร 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
PIP_DOWNLOAD_CACHE
ไดเรกทอรี เช่นตอนนี้ฉันมีแพ็คเกจ Django ค่อนข้างน้อยvirtualenvs
บนเครื่องบิน แต่ก็ยังยอดเยี่ยมในความคิดของฉันpip2pi
มันเป็นทางออกที่สง่างามและน่าเชื่อถือสำหรับปัญหานี้
จากเอกสาร:
pip2pi สร้างที่เก็บแพคเกจที่เข้ากันได้กับ PyPI จากข้อกำหนดของ pip
pip2pi
ช่วยให้คุณสร้างดัชนี PyPI ของคุณเองโดยใช้คำสั่งง่ายๆสองคำสั่ง:
ในการทำมิเรอร์แพ็คเกจและข้อกำหนดทั้งหมดให้ใช้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
ในการสร้างดัชนีแพ็คเกจจากไดเรกทอรีก่อนหน้า:
$ 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
ในการติดตั้งจากดัชนีที่คุณสร้างในขั้นตอนที่ 2 คุณสามารถใช้:
pip install --index-url=file:///tmp/packages/simple/ httpie==0.2
pip2pi
คุณยังสามารถสะท้อนดัชนีของคุณเองไปยังโฮสต์ระยะไกลด้วย
pip2tgz
ตรวจสอบว่าคุณได้ดาวน์โหลดแพคเกจไปยังไดเรกทอรีที่กำหนดไว้แล้วดังนั้นหากคุณเรียกใช้บรรทัดการติดตั้งเดียวกันหรือหลายบรรทัดการติดตั้งที่มีการทับซ้อนกัน
รุ่น Pip ที่ใหม่กว่าตอนนี้แคชดาวน์โหลดตามค่าเริ่มต้น ดูเอกสารนี้:
https://pip.pypa.io/en/stable/reference/pip_install/#caching
สร้างชื่อไฟล์กำหนดค่า~/.pip/pip.conf
และเพิ่มเนื้อหาต่อไปนี้:
[global]
download_cache = ~/.cache/pip
บน OS X จะมีเส้นทางที่ดีกว่าในการเลือก~/Library/Caches/pip
เนื่องจากเป็นไปตามข้อกำหนดของโปรแกรม OS X อื่น ๆ ที่ใช้
pip.conf
การdownload_cache
ตั้งค่าที่ชี้ไปยังไดเรกทอรีทั้งระบบเดียวกัน
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 ที่สองเพื่อติดตั้งแพ็กเกจโดยไม่ต้องดาวน์โหลด
เริ่มต้นในรุ่น 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
ตัวเลือก
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 บิตเป็นต้น
ใช้ 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 แต่เนื่องจากดัชนี ฟังก์ชั่นแล้วเป็นแคชชนิดหนึ่งซึ่งไม่จำเป็นต้องนำมามากมันจะช่วยถ้าดัชนีของคุณถูกทำให้ว่างเปล่า)
มีวิธีแก้ไขปัญหาใหม่สำหรับสิ่งนี้เรียกว่าpip-accelซึ่งเป็นการแทนที่แบบแทนที่สำหรับการpip
แคชในตัว
โปรแกรม pip-accel เป็น wrapper ของ pip ซึ่งเป็น Python package manager มันเร่งการใช้ pip เพื่อเริ่มต้นสภาพแวดล้อมเสมือน Python ที่กำหนดตั้งแต่หนึ่งไฟล์ความต้องการ มันทำได้โดยการรวมสองวิธีต่อไปนี้:
การดาวน์โหลดการกระจายแหล่งที่มาจะถูกแคชและใช้เพื่อสร้างดัชนีโลคัลของไฟล์เก็บถาวรการกระจายต้นฉบับ
การแจกแจงแบบไบนารีจะใช้เพื่อเพิ่มความเร็วในกระบวนการติดตั้งการอ้างอิงกับคอมโพเนนต์ไบนารี (เช่น M2Crypto และ LXML) แทนที่จะคอมไพล์การอ้างอิงเหล่านี้อีกครั้งสำหรับสภาพแวดล้อมเสมือนจริงทุกครั้งที่เรารวบรวมพวกมันหนึ่งครั้งและแคชผลลัพธ์เป็นการกระจายแบบไบนารี่ * .tar.gz
Paylogic ใช้ pip-accel เพื่อเริ่มต้นสภาพแวดล้อมเสมือนจริงอย่างรวดเร็วและเชื่อถือได้ในฟาร์มของพวกมันที่รวมทาสอย่างต่อเนื่องซึ่งกำลังทำการทดสอบหน่วยอยู่ตลอดเวลา เรายังใช้มันในการสร้างเซิร์ฟเวอร์ของเรา
เราได้มองเห็นได้รอบ 10x speedup จากการเปลี่ยนจากการpip
pip-accel
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
คุณยังสามารถใช้เพื่ออัปเดตตระกร้าเมื่อใดก็ตามที่คุณออนไลน์
ฉันคิดว่าแพ็คเกจ "pip-accel" ต้องเป็นตัวเลือกที่ดี