วิธีการติดตั้งแพคเกจออฟไลน์?


160

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


คำตอบ:


77

หากแพ็กเกจอยู่บน PYPI ให้ดาวน์โหลดและอ้างอิงกับไดเร็กทอรีโลคัลบางตัว เช่น

$ mkdir / pypi && cd / pypi
$ ls -la
  -rw-r - r-- เจ้าหน้าที่ pavel 1 คน 237954 19 เม.ย. 11:31 Flask-WTF-0.6.tar.gz
  -rw-r - r-- พนักงาน pavel 1 คน 389741 22 ก.พ. 17:10 Jinja2-2.6.tar.gz
  -rw-r - r-- พนักงาน pavel 1 คน 70305 11 เม.ย. 00:28 MySQL-python-1.2.3.tar.gz
  -rw-r - r-- พนักงาน pavel 1 คน 2597214 10 เม.ย. 18:26 SQLAlchemy-0.7.6.tar.gz
  -rw-r - r-- พนักงาน 1 pavel 1108056 22 ก.พ. 17:10 Werkzeug-0.8.2.tar.gz
  -rw-r - r-- พนักงาน pavel 1 คน 488207 10 เม.ย. 18:26 boto-2.3.0.tar.gz
  -rw-r - r-- พนักงาน 1 pavel 490192 16 เม.ย. 12:00 flask-0.9-dev-2a6c80a.tar.gz

แพคเกจบางอย่างอาจต้องเก็บไว้ใน tarballs ดูคล้ายกันด้วยมือ ฉันทำมันมากเมื่อฉันต้องการบางสิ่งบางอย่างที่ใหม่กว่า (มีความเสถียรน้อยกว่า) แพคเกจบางอย่างไม่ได้อยู่ใน PYPI ดังนั้นจึงใช้กับมันเช่นกัน

~/src/myappสมมติว่าคุณมีโปรแกรมหลามรูปแบบที่ถูกต้องใน ~/src/myapp/setup.pyจะมีinstall_requiresรายการที่กล่าวถึงสิ่งหนึ่งหรือหลายสิ่งที่คุณมีใน/pypiไดเรกทอรีของคุณ ชอบมาก

  install_requires=[
    'boto',
    'Flask',
    'Werkzeug',
    # and so on

หากคุณต้องการเรียกใช้แอปของคุณด้วยการอ้างอิงที่จำเป็นทั้งหมดในขณะที่ยังแฮ็คแอปอยู่คุณจะทำสิ่งนี้:

$ cd ~ / src / myapp
$ python setup.py พัฒนา --al-unzip --allow-hosts = None --find-links = / pypi

วิธีนี้แอปของคุณจะถูกดำเนินการโดยตรงจากไดเรกทอรีต้นทางของคุณ คุณสามารถแฮ็คสิ่งต่าง ๆ จากนั้นรันแอปอีกครั้งโดยไม่ต้องสร้างใหม่

หากคุณต้องการติดตั้งแอพและการพึ่งพาในสภาพแวดล้อมหลามปัจจุบันคุณจะทำสิ่งนี้:

$ cd ~ / src / myapp
$ easy_install - เปิด - เปิดเครื่องรูด --allow-hosts = None --find-links = / pypi

ในทั้งสองกรณีบิลด์จะล้มเหลวหากการอ้างอิงหนึ่งรายการขึ้นไปไม่มีอยู่ใน/pypiไดเรกทอรี มันจะไม่พยายามติดตั้งสิ่งที่ขาดหายไปจากอินเทอร์เน็ต

ฉันขอแนะนำให้เรียกใช้setup.py develop ...และeasy_install ...ภายในสภาพแวดล้อมเสมือนจริงที่ใช้งานเพื่อหลีกเลี่ยงการปนเปื้อนสภาพแวดล้อม Python ทั่วโลกของคุณ มันคือ (virtualenv นั่นคือ) วิธีที่จะไป อย่าติดตั้งอะไรลงในสภาพแวดล้อม Python ระดับโลก

หากเครื่องที่คุณสร้างแอพของคุณมีสถาปัตยกรรมเดียวกับเครื่องที่คุณต้องการปรับใช้คุณสามารถ tarball ไดเรกทอรีสภาพแวดล้อมเสมือนทั้งหมดที่คุณทำeasy_installทุกอย่างได้ ก่อน tarballing แม้ว่าคุณจะต้องทำให้ relocatable ไดเรกทอรีสภาพแวดล้อมเสมือนจริง (ดู--relocatableตัวเลือก) หมายเหตุ:เครื่องปลายทางจะต้องติดตั้ง Python รุ่นเดียวกันและการพึ่งพา C-based ใด ๆ ที่แอพของคุณอาจต้องติดตั้งไว้ล่วงหน้าด้วยเช่นกัน (เช่นพูดว่าถ้าคุณพึ่งพาPILแล้วต้องติดตั้ง libpng, libjpeg ฯลฯ ) .


3
แทนที่จะ--allow-hosts=Noneคุณสามารถใช้สวิทช์--no-index
romor

คุณช่วยอธิบายวิธีการสร้างแอพพลิเคชั่น Python ที่มีรูปแบบถูกต้องได้ไหม?
psr

3
@PrabhjotRai โปรดดูที่Packaging.python.org/distributing
Pavel Repin

300

downloadคำสั่งpip ให้คุณดาวน์โหลดแพ็คเกจโดยไม่ต้องติดตั้ง:

pip download -r requirements.txt

(ใน pip รุ่นก่อนหน้านี้จะมีการสะกดคำpip install --download -r requirements.txtนี้)

จากนั้นคุณสามารถใช้pip install --no-index --find-links /path/to/download/dir/ -r requirements.txtเพื่อติดตั้ง sdists ที่ดาวน์โหลดมาโดยไม่ต้องเข้าถึงเครือข่าย


ปัญหานี้คือการอ้างอิงที่อาจมีการอ้างอิงอื่น ๆ และสิ่งเหล่านั้นจะไม่ถูกดาวน์โหลด
vikki

ตะกร้างู (สร้างอยู่บนจุดเล็ก ๆ ) จะดาวน์โหลดการพึ่งพาของผู้อ้างอิงเช่นกัน
vikki

14
@vikki ไม่จริง "pip install --download" ดาวน์โหลดการอ้างอิงดังนั้นคำสั่งข้างต้นจะทำงานได้อย่างถูกต้องแม้ว่าความต้องการของคุณจะมีการขึ้นต่อกันเพิ่มเติม ตะกร้างูอาจทำสิ่งที่มีประโยชน์อื่น ๆ (ไม่เคยใช้) แต่ก็ไม่จำเป็นอย่างแน่นอนสำหรับเหตุผลนั้น
คาร์ลเมเยอร์

6
@vikki ฉันเข้าใจว่าคุณกำลังพูดอะไร แต่ฉันกำลังบอกคุณว่ามันไม่เป็นความจริง :-) คุณควรลองทำก่อนที่คุณจะโพสต์ข้อความยืนยันเดิมอีกครั้ง ฉันเพิ่งใส่ "pytest" ใน requirements.txt รัน "pip install --download. -r requirements.txt" และมันดาวน์โหลด sdists สำหรับทั้ง pytest และการติดตั้ง setup.py, "py"
Carl Meyer

3
ฉันคิดว่ามันควรจะเป็น: --find-links file:/path/to/some/dir/และคุณควรดาวน์โหลดและติดตั้งด้วย pip รุ่นเดียวกัน - มิฉะนั้นมันอาจจะล้มเหลว
A. Binzxxxxxx

57

หากคุณต้องการติดตั้ง python libs และการอ้างอิงแบบออฟไลน์ให้ทำตามขั้นตอนเหล่านี้บนเครื่องที่มีระบบปฏิบัติการเดียวกันเชื่อมต่อเครือข่ายและติดตั้ง Python:

1) สร้างrequirements.txtไฟล์ที่มีเนื้อหาคล้ายกัน (หมายเหตุ - นี่คือไลบรารีที่คุณต้องการดาวน์โหลด):

Flask==0.12
requests>=2.7.0
scikit-learn==0.19.1
numpy==1.14.3
pandas==0.22.0

pip freeze > requirements.txtทางเลือกหนึ่งสำหรับการสร้างแฟ้มต้องการคือการใช้งาน นี่จะแสดงรายการไลบรารีทั้งหมดในสภาพแวดล้อมของคุณ จากนั้นคุณสามารถเข้าไปrequirements.txtและลบรายการที่ไม่ต้องการได้

2) ดำเนินการคำสั่งmkdir wheelhouse && pip download -r requirements.txt -d wheelhouseเพื่อดาวน์โหลด libs และการอ้างอิงไปยังไดเรกทอรีwheelhouse

3) คัดลอก requirements.txt ไปยังwheelhouseไดเรกทอรี

4) เก็บ wheelhouse เข้าไปwheelhouse.tar.gzด้วยtar -zcf wheelhouse.tar.gz wheelhouse

จากนั้นอัปโหลดwheelhouse.tar.gzไปยังเครื่องเป้าหมายของคุณ:

1) ดำเนินการtar -zxf wheelhouse.tar.gzเพื่อแตกไฟล์

2) ดำเนินการpip install -r wheelhouse/requirements.txt --no-index --find-links wheelhouseเพื่อติดตั้ง libs และการอ้างอิง


6
นี่คือคำตอบที่ชัดเจนที่สุดพร้อมขั้นตอนที่เหมาะสมสำหรับผู้เริ่มต้น ขอบคุณ
kumarharsh

นี่เป็นวิธีการที่ฉันได้เห็น ขอบคุณ!
peluzza

2
แต่ต่อไปนี้คำสั่งของคุณเมื่อฉันpip installในท้ายที่สุดมันพูดว่า: ข้อผิดพลาด: ไม่สามารถหารุ่นที่ตอบสนองความต้องการ ..`
DennisLi

@DennisLi หลามและ pip ​​เวอร์ชันอะไร?
chaokunyang

ฉันคิดว่านี่เป็นเพราะ pip ​​ไม่สามารถหาแพ็คเกจของ pandas ในความต้องการของฉันได้เนื่องจากฉันใช้ pip3 เพื่อติดตั้ง pandas 0.2
DennisLi

13

หลามออฟไลน์ สำหรับการทำเช่นนี้ฉันใช้ virtualenv (สภาพแวดล้อม Python แยก)

1) ติดตั้ง virtualenv ออนไลน์ด้วย pip:

pip install virtualenv --user

หรือออฟไลน์ด้วย whl: ไปที่ลิงค์นี้ดาวน์โหลดรุ่นล่าสุด (.whl หรือ tar.gz) และติดตั้งด้วยคำสั่งนี้:

pip install virtualenv-15.1.0-py2.py3-none-any.whl --user

โดยใช้ที่คุณไม่จำเป็นต้องใช้--usersudo pip…

2) ใช้ virtualenv

บนเครื่องออนไลน์เลือกไดเรกทอรีที่มี terminal cdและเรียกใช้รหัสนี้:

python -m virtualenv myenv
cd myenv
source bin/activate
pip install Flask

หลังจากติดตั้งแพคเกจทั้งหมดคุณต้องสร้างrequirements.txtดังนั้นในขณะที่ virtualenv ของคุณใช้งานเขียน

pip freeze > requirements.txt

เปิดอาคารผู้โดยสารแห่งใหม่และสร้าง env myenv2อื่นเช่น

python -m virtualenv myenv2
cd myenv2
source bin/activate
cd -
ls

ตอนนี้คุณสามารถไปที่โฟลเดอร์ออฟไลน์ที่มีrequirements.txtและtranferred_packagesโฟลเดอร์อยู่ในนั้น ดาวน์โหลดแพ็คเกจด้วยรหัสต่อไปนี้และนำไปไว้ในtranferred_packagesโฟลเดอร์

pip download -r requirements.txt

นำโฟลเดอร์ออฟไลน์ของคุณไปยังคอมพิวเตอร์ออฟไลน์แล้ว

python -m virtualenv myenv2
cd myenv2
source bin/activate
cd -
cd offline
pip install --no-index --find-links="./tranferred_packages" -r requirements.txt

สิ่งที่อยู่ในโฟลเดอร์ออฟไลน์ [requirements.txt, tranferred_packages {Flask-0.10.1.tar.gz, ... }]

ตรวจสอบรายการแพ็คเกจของคุณ

pip list

หมายเหตุ: เนื่องจากเราอยู่ในปี 2560 จะเป็นการดีกว่าถ้าใช้ python 3 คุณสามารถสร้าง python 3 virtualenv ด้วยคำสั่งนี้

virtualenv -p python3 envname

2
ดูเหมือนจะมีขั้นตอนที่ขาดหายไปหรือ "obfuscated" ที่นี่ฉันคาดว่าจะเห็น 'ปิดการใช้งาน' แล้ว 'pip ตรึง' ... ซีดีออฟไลน์และ. / tranferred_packages ปรากฏขึ้นจากที่ใดเลย - ต้องการล้างข้อมูลหรือไม่
Hannu

อาจ แต่คุณควรพิจารณา 'ฉันต้องการโพสต์สั้น ๆ ', 'กระบวนการนั้นซับซ้อนและฉันไม่สามารถเขียนทุกขั้นตอน (เป็นไปได้เฉพาะใน YouTube)'
cyera

นี่เป็นคำตอบที่ดีที่สุด ช่วยได้มาก
webofmars

นี่จะเป็นคำตอบที่ดีที่สุดหากมีการพูดถึงวิธีการตั้งค่าโฟลเดอร์ tranferred_packages โดยไม่มีขั้นตอนที่สำคัญ -1
Zim

8

ดาวน์โหลดtarballโอนไปยังเครื่อง FreeBSD ของคุณและแตกไฟล์แล้วรันหลังจากนั้นpython setup.py installเสร็จแล้ว!

แก้ไข: เพียงเพิ่มที่คุณสามารถติดตั้ง tarballs ด้วย pip ตอนนี้


1
แล้วการพึ่งพาทั้งหมดล่ะ วิธีที่ดีที่สุดในการแก้ไขพวกเขาคืออะไร? ฉันจำเป็นต้องติดตั้งการอ้างอิงด้วยตนเองด้วยหรือไม่
Chris Drantz

ใช่นั่นเป็นวิธีเดียวที่ฉันรู้
dav1d

8

ให้ฉันทำตามกระบวนการทีละขั้นตอน:

  1. บนคอมพิวเตอร์ที่เชื่อมต่อกับอินเทอร์เน็ตให้สร้างโฟลเดอร์
   $ mkdir packages
   $ cd packages
  1. เปิดพรอมต์คำสั่งหรือเชลล์แล้วดำเนินการคำสั่งต่อไปนี้:

    สมมติว่าแพ็คเกจที่คุณต้องการคือ tensorflow

    $ pip download tensorflow

  2. ในตอนนี้บนคอมพิวเตอร์เป้าหมายให้คัดลอกpackagesโฟลเดอร์และใช้คำสั่งต่อไปนี้

  $ cd packages
  $ pip install 'tensorflow-xyz.whl' --no-index --find-links '.'

โปรดทราบว่าtensorflow-xyz.whlจะต้องถูกแทนที่ด้วยชื่อเดิมของแพ็คเกจที่ต้องการ


6

ใช้wheelแพคเกจรวบรวม

มัดขึ้น:

$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
$ pip wheel -r requirements.txt --wheel-dir=$tempdir
$ cwd=`pwd`
$ (cd "$tempdir"; tar -cjvf "$cwd/bundled.tar.bz2" *)

คัดลอก tarball และติดตั้ง:

$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
$ (cd $tempdir; tar -xvf /path/to/bundled.tar.bz2)
$ pip install --force-reinstall --ignore-installed --upgrade --no-index --no-deps $tempdir/*

หมายเหตุwheelแพ็คเกจไบนารีไม่ได้อยู่ในเครื่อง

อ้างอิงเพิ่มเติม ที่นี่: https://pip.pypa.io/en/stable/user_guide/#installation-bundles


1
ฉันมีปัญหาเกี่ยวกับการรวมกับเครื่องที่มี Python 3.6 และแยกออกด้วย Python 3.5: " <package> .whl ไม่ใช่วงล้อที่รองรับบนแพลตฟอร์มนี้ " เวอร์ชันต้นทางและปลายทางอาจจำเป็นต้องจับคู่กับบางแพ็คเกจ
Juuso Ohtonen

6

ฉันมีปัญหาที่คล้ายกัน และฉันต้องทำให้มันติดตั้งแบบเดียวกันเราทำจาก pypi

ฉันทำสิ่งต่อไปนี้:

  1. สร้างไดเรกทอรีเพื่อจัดเก็บแพ็คเกจทั้งหมดในเครื่องที่มีอินเทอร์เน็ต

    mkdir -p /path/to/packages/
  2. ดาวน์โหลดแพ็คเกจทั้งหมดไปยังเส้นทาง

    pip download -r requirements.txt -d /path/to/packages
    
    Eg:- ls /root/wheelhouse/  # **/root/wheelhouse** is my **/path/to/packages/**
    total 4524
    -rw-r--r--. 1 root root   16667 May 23  2017 incremental-17.5.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   34713 Sep  1 10:21 attrs-18.2.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root 3088398 Oct 15 14:41 Twisted-18.9.0.tar.bz2
    -rw-r--r--. 1 root root  133356 Jan 28 15:58 chardet-3.0.4-py2.py3-none-any.whl
    -rw-r--r--. 1 root root  154154 Jan 28 15:58 certifi-2018.11.29-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   57987 Jan 28 15:58 requests-2.21.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   58594 Jan 28 15:58 idna-2.8-py2.py3-none-any.whl
    -rw-r--r--. 1 root root  118086 Jan 28 15:59 urllib3-1.24.1-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   47229 Jan 28 15:59 tqdm-4.30.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root    7922 Jan 28 16:13 constantly-15.1.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root  164706 Jan 28 16:14 zope.interface-4.6.0-cp27-cp27mu-manylinux1_x86_64.whl
    -rw-r--r--. 1 root root  573841 Jan 28 16:14 setuptools-40.7.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   37638 Jan 28 16:15 Automat-0.7.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   37905 Jan 28 16:15 hyperlink-18.0.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   52311 Jan 28 16:15 PyHamcrest-1.9.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   10586 Jan 28 16:15 six-1.12.0-py2.py3-none-any.whl
  3. Tar ไดเรกทอรีแพ็คเกจและคัดลอกไปยังเครื่องที่ไม่สามารถเข้าถึงอินเทอร์เน็ต จากนั้นทำ

    cd /path/to/packages/
    tar -cvzf packages.tar.gz .  # not the . (dot) at the end

    คัดลอกpackages.tar.gzไปยังเครื่องปลายทางที่ไม่มีอินเทอร์เน็ต

  4. ในเครื่องที่ไม่มีการเชื่อมต่ออินเทอร์เน็ตให้ทำดังต่อไปนี้ (สมมติว่าคุณคัดลอกแพ็กเกจ tarred ไปยัง/ path / to / package /ในเครื่องปัจจุบัน)

    cd /path/to/packages/
    tar -xvzf packages.tar.gz
    mkdir -p $HOME/.config/pip/
    
    vi $HOME/.config/pip/pip.conf

    และวางเนื้อหาต่อไปนี้ภายในและบันทึก

    [global]
    timeout = 10
    find-links = file:///path/to/package/
    no-cache-dir = true
    no-index = true
  5. สุดท้ายนี้ฉันแนะนำให้คุณใช้รูปแบบของvirtualenvการติดตั้งแพ็กเกจ

    virtualenv -p python2 venv # use python3, if you are on python3
    source ./venv/bin/activate
    pip install <package>

คุณควรจะสามารถที่จะดาวน์โหลดโมดูลทั้งหมดที่อยู่ในไดเรกทอรี/ เส้นทาง / เพื่อ / แพคเกจ /

หมายเหตุ: ฉันทำสิ่งนี้เพียงเพราะฉันไม่สามารถเพิ่มตัวเลือกหรือเปลี่ยนวิธีการติดตั้งโมดูล มิฉะนั้นฉันจะทำ

    pip install --no-index --find-links /path/to/download/dir/ -r requirements.txt

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