การติดตั้งแพ็กเกจ Python จากโฟลเดอร์ระบบไฟล์โลคัลเป็น virtualenv ด้วย pip


346

เป็นไปได้หรือไม่ที่จะติดตั้งแพ็คเกจโดยใช้ pip จากระบบไฟล์ในเครื่อง?

ฉันใช้python setup.py sdistงานแพ็คเกจซึ่งสร้างไฟล์ tar.gz ที่เหมาะสม /srv/pkg/mypackage/mypackage-0.1.0.tar.gzไฟล์นี้จะถูกเก็บไว้ในระบบของฉันที่

ขณะนี้อยู่ในสภาพแวดล้อมเสมือนจริงฉันต้องการติดตั้งแพคเกจทั้งที่มาจาก pypi หรือจากที่ตั้ง/srv/pkgเฉพาะ

เป็นไปได้ไหม

ป.ล. ฉันรู้ว่าฉันสามารถระบุpip install /srv/pkg/mypackage/mypackage-0.1.0.tar.gzได้ ที่จะทำงาน แต่ฉันพูดคุยเกี่ยวกับการใช้สถานที่เป็นสถานที่สำหรับจุดอื่นเพื่อค้นหาถ้าฉันพิมพ์/srv/pkgpip install mypackage


ผมกำลังมองหาการติดตั้งแพคเกจ PyPi โดยไม่ต้อง setup.py จาก WHL pip install <Path-to-WHL-file>ล้อและจะได้รับการติดตั้งหลังจากที่ผมดาวน์โหลดรุ่นที่ถูกต้องสำหรับรุ่นหลามของฉันและวิ่ง
Wiktor Stribiżew

คำตอบ:


136

ฉันค่อนข้างแน่ใจว่าสิ่งที่คุณกำลังมองหาเรียกว่า--find-linksตัวเลือก

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

https://github.com/wolever/pip2pi


100
pip install mypackage --no-index --find-links file:///srv/pkg/mypackageควรทำงาน.
jfs

1
มันช่วยได้ และเราสามารถใช้-iตัวเลือกของ pip เพื่อจัดการมันเป็น PyPI ในพื้นที่
diabloneo

คำสั่ง easy_install ที่เทียบเท่าคือeasy_install --allow-hosts=None --find-links file:///srv/pkg/mypackage mypackage
Wilfred Hughes

ฉันต้องสร้างไฟล์การแจกจ่ายซอร์สไม่ใช่เพียงชี้ไปที่โปรเจ็กต์หรือไดเร็กทอรีแพ็กเกจก่อนที่จะทำงาน สิ่งนี้ทำให้ฉันสะดุด docs.python.org/3.6/distutils/sourcedist.html
Josh

3
โปรดทราบว่า--find-linksจะยังคงอนุญาตให้ค้นหาบน PyPI หากไม่พบแพ็คเกจในตำแหน่งที่ระบุหรือหากมีเวอร์ชั่นที่ใหม่กว่า บน Windows ฉันพบว่าการรวมนี้กับ--only-binary=packagename(หรือ--only-binary=:all:) เป็นพิเศษที่มีประโยชน์ สิ่งนี้ป้องกันไม่ให้ pip พยายามดาวน์โหลดแพ็กเกจใด ๆ ที่มีการอ้างอิงดั้งเดิมที่มีการแจกจ่ายแหล่งข้อมูลบน PyPI เท่านั้น (และต้องมีการรวบรวม) ซึ่งเป็นสาเหตุที่พบบ่อยที่สุดที่ฉันต้องลองติดตั้งจากไดเรกทอรี แตกต่างจาก--no-indexฉันยังคงสามารถติดตั้งแพ็คเกจอื่น ๆจาก PyPI
jpmc26

463

เกี่ยวกับ ::

pip install --help
...
  -e, --editable <path/url>   Install a project in editable mode (i.e. setuptools
                              "develop mode") from a local project path or a VCS url.

เช่น, pip install -e /srv/pkg

โดยที่ / srv / pkg เป็นไดเรกทอรีระดับบนสุดที่สามารถพบ 'setup.py'


49
สิ่งนี้จะติดตั้งแพ็กเกจในโหมดพัฒนาซึ่งหมายความว่ามันจะลิงก์กลับไปยังแหล่งที่มา หากมีโอกาสย้ายหรือลบแหล่งที่มาการนำเข้าแพคเกจจะล้มเหลว
Trasplazio Garzuglio

3
@MarcoDinacci สิ่งที่น่าสนใจเกี่ยวกับ--editableมันดูเหมือนว่าจะมองเข้าไปในไดเรกทอรีของแพคเกจท้องถิ่นและตั้งค่าแหล่งที่มาเป็น repo คอมไพล์ถ้ามีหนึ่ง - บิตมีความยืดหยุ่นมากกว่าเพียงแค่โฟลเดอร์ ฉันไม่สามารถหาเอกสารสำหรับสิ่งนี้ได้
NotSimon

3
ขณะนี้สิ่งนี้ถูกต้องสำหรับการติดตั้งแพคเกจโดยเฉพาะอย่างยิ่งหนึ่งในการพัฒนาปัจจุบัน / เข้มข้นบนเครื่องท้องถิ่นหรือ VCS url มันไม่ได้ตอบคำถามเกี่ยวกับการค้นหาไดเรกทอรีแม่สำหรับแหล่งที่มาของแพคเกจท้องถิ่นเมื่อเทียบกับแหล่งที่มาของแพคเกจหนึ่งโดยเฉพาะ คำตอบที่ยอมรับใช้งานได้เมื่อคุณมีไดเร็กตอรี่หรือ url ที่มีหลายแพ็คเกจที่คุณต้องการติดตั้ง pip
กาวิน

@MarcoDinacci อย่างไรก็ตามให้สมมติว่าผู้ใช้ดาวน์โหลดรหัส พวกเขาวางโปรแกรมไว้ในตำแหน่งที่พวกเขาต้องการหากพวกเขาฉลาด ทำไมพวกเขาต้องการย้ายมัน
Zelphir Kaltstahl

1
@Simon มีวิธีบอก pip ไม่ให้มองหา repo คอมไพล์รึเปล่า? หากฉันdo pip install -eตรวจสอบรหัสจากรีโมต git ฉันต้องการติดตั้งโค้ดตามที่เป็นอยู่ (พร้อมการเปลี่ยนแปลงที่ยังไม่ได้อยู่ในรีโมท)
Pedru

39

ฉันกำลังติดตั้งpyfuzzyแต่ไม่ได้อยู่ใน PyPI; มันจะส่งคืนข้อความ: No matching distribution found for pyfuzzy.

ฉันลองคำตอบที่ยอมรับแล้ว

pip install  --no-index --find-links=file:///Users/victor/Downloads/pyfuzzy-0.1.0 pyfuzzy

แต่มันไม่ทำงานอย่างใดอย่างหนึ่งและส่งกลับข้อผิดพลาดต่อไปนี้:

ละเว้นดัชนี: https://pypi.python.org/simple การ รวบรวม pyfuzzy ไม่พบรุ่นที่ตรงตามข้อกำหนด pyfuzzy (จากรุ่น:) ไม่พบการแจกแจงที่ตรงกันสำหรับ pyfuzzy

ในที่สุดฉันก็พบวิธีง่าย ๆ ที่นั่น: https://pip.pypa.io/en/latest/reference/pip_install.html

Install a particular source archive file.
$ pip install ./downloads/SomePackage-1.0.4.tar.gz
$ pip install http://my.package.repo/SomePackage-1.0.4.zip

ดังนั้นคำสั่งต่อไปนี้ทำงานให้ฉัน:

pip install ../pyfuzzy-0.1.0.tar.gz.

หวังว่ามันจะช่วยคุณได้


4
สิ่งนี้ใช้ได้สำหรับฉัน ฉันลองใช้วิธีอื่นและพบCould not find a version that satisfiesข้อผิดพลาด ขอบคุณ
Rair

21

นี่คือทางออกที่ฉันใช้:

import pip


def install(package):
    # Debugging
    # pip.main(["install", "--pre", "--upgrade", "--no-index",
    #         "--find-links=.", package, "--log-file", "log.txt", "-vv"])
    pip.main(["install", "--upgrade", "--no-index", "--find-links=.", package])


if __name__ == "__main__":
    install("mypackagename")
    raw_input("Press Enter to Exit...\n")

ผมปะติดปะต่อนี้จากจุดติดตั้งตัวอย่างเช่นเดียวกับจากคำตอบ Rikard ของในคำถามอื่น อาร์กิวเมนต์ "--pre" ช่วยให้คุณติดตั้งเวอร์ชันที่ไม่ได้ใช้งานจริง อาร์กิวเมนต์ "- ไม่มีดัชนี" หลีกเลี่ยงการค้นหาดัชนี PyPI "--find-links =." การค้นหาข้อโต้แย้งในโฟลเดอร์ท้องถิ่น (ซึ่งอาจเป็นญาติหรือแน่นอน) ฉันใช้อาร์กิวเมนต์ "--log-file", "log.txt" และ "-vv" สำหรับการดีบัก อาร์กิวเมนต์ "- อัปเกรด" ให้คุณติดตั้งเวอร์ชันที่ใหม่กว่าเวอร์ชันที่เก่ากว่า

ฉันพบวิธีที่ดีในการถอนการติดตั้ง สิ่งนี้มีประโยชน์เมื่อคุณมีสภาพแวดล้อม Python ที่แตกต่างกัน เป็นรูปแบบพื้นฐานเดียวกันโดยใช้ "ถอนการติดตั้ง" แทน "ติดตั้ง" ด้วยมาตรการความปลอดภัยเพื่อป้องกันการถอนการติดตั้งโดยไม่ตั้งใจ:

import pip


def uninstall(package):
    response = raw_input("Uninstall '%s'? [y/n]:\n" % package)
    if "y" in response.lower():
        # Debugging
        # pip.main(["uninstall", package, "-vv"])
        pip.main(["uninstall", package])
    pass


if __name__ == "__main__":
    uninstall("mypackagename")
    raw_input("Press Enter to Exit...\n")

โฟลเดอร์โลคัลมีไฟล์เหล่านี้: install.py, uninstall.py, mypackagename-1.0.zip


1
ขอบคุณ "--find-links =." และ "- no-index" โดยที่คีย์ในการรวมสคริปต์ python เข้าด้วยกันภายในชุดเครื่องมือของฉันนั้นจะทำการลบแพ็คเกจเวอร์ชั่นเก่าออกจากแพ็คเกจไซต์จากนั้นจึงติดตั้งแพ็คเกจ tar.gz'ed จากตำบล ของ utility-package-folder (ไม่ทราบ --find-links =.) จากนั้นสร้างวงล้อและติดตั้ง อัตโนมัติทั้งหมดผ่านทาง plumbum และคลิก หากมีคนต้องการฉันจะโพสต์ลิงก์ upvoted
JackLeEmmerdeur

15

ตัวเลือก- ค้นหาลิงก์ทำงานและทำงานได้จากrequirements.txtไฟล์!

คุณสามารถวางแพ็กเกจการเก็บถาวรในบางโฟลเดอร์และใช้ไฟล์ล่าสุดโดยไม่ต้องเปลี่ยนไฟล์ข้อกำหนดตัวอย่างเช่นrequirements:

.
└───requirements.txt
└───requirements
    ├───foo_bar-0.1.5-py2.py3-none-any.whl
    ├───foo_bar-0.1.6-py2.py3-none-any.whl
    ├───wiz_bang-0.7-py2.py3-none-any.whl
    ├───wiz_bang-0.8-py2.py3-none-any.whl
    ├───base.txt
    ├───local.txt
    └───production.txt

ตอนนี้requirements/base.txtใส่:

--find-links=requirements
foo_bar
wiz_bang>=0.8

วิธีที่เป็นระเบียบในการอัปเดตแพ็กเกจที่เป็นกรรมสิทธิ์เพียงวางใหม่ในโฟลเดอร์

ด้วยวิธีนี้คุณสามารถติดตั้งแพ็คเกจจากlocal folderและpypiด้วยการโทรเดียว:pip install -r requirements/production.txt

PS ดูcookiecutter-djangopackageของฉันเพื่อดูวิธีแยกความต้องการและใช้การจัดระเบียบโฟลเดอร์ตามข้อกำหนด


ขอบคุณนี้ดียิ่งกว่าสิ่งที่ฉันคิดว่าจะทำ!
FoundNil

12

จากหน้าการติดตั้งแพ็คเกจคุณสามารถเรียกใช้:

pip install / srv / pkg / mypackage

ที่/ srv / pkg / mypackageมีไดเรกทอรีที่มีsetup.py


นอกจากนี้1คุณสามารถติดตั้งได้จากไฟล์เก็บถาวร:

pip install ./mypackage-1.0.4.tar.gz

1 แม้ว่าจะมีการระบุไว้ในคำถามเนื่องจากความนิยมมันก็รวมอยู่ด้วย


2
นี่ควรเป็นคำตอบเริ่มต้น ไม่จำเป็นต้องทำการ pip ตามไปด้วย - ค้นหาลิงค์ถ้าคุณรู้ว่าแพ็คเกจของคุณอยู่ที่ไหนในเครื่องท้องถิ่น
Robert

6

สมมติว่าคุณมี virtualenv และrequirements.txtไฟล์จากนั้นคุณสามารถกำหนดภายในไฟล์นี้เพื่อรับแพ็คเกจ:

# Published pypi packages 
PyJWT==1.6.4
email_validator==1.0.3
# Remote GIT repo package, this will install as django-bootstrap-themes
git+https://github.com/marquicus/django-bootstrap-themes#egg=django-bootstrap-themes
# Local GIT repo package, this will install as django-knowledge
git+file:///soft/SANDBOX/python/django/forks/django-knowledge#egg=django-knowledge

5

มีข้อกำหนดในrequirements.txtและegg_dirเป็นไดเรกทอรี

คุณสามารถสร้างแคชในพื้นที่ของคุณ:

$ pip download -r requirements.txt -d eggs_dir

จากนั้นการใช้ "แคช" นั้นง่ายเหมือน:

$ pip install -r requirements.txt --find-links=eggs_dir


1

ในการติดตั้งเฉพาะในพื้นที่คุณต้องมี 2 ตัวเลือก:

  • --find-links: สถานที่ที่จะมองหาการอ้างอิง ไม่จำเป็นต้องมีfile://คำนำหน้าที่ผู้อื่นพูดถึง
  • --no-index: อย่าดูในดัชนี pypi สำหรับการพึ่งพาที่ขาดหายไป (ไม่ได้ติดตั้งการพึ่งพาและไม่ได้อยู่ใน--find-linksพา ธ )

ดังนั้นคุณสามารถเรียกใช้จากโฟลเดอร์ใด ๆ ต่อไปนี้:

pip install --no-index --find-links /srv/pkg /path/to/mypackage-0.1.0.tar.gz

หาก mypackage ของคุณมีการตั้งค่าอย่างถูกต้องมันจะแสดงรายการการพึ่งพาทั้งหมดและถ้าคุณใช้การดาวน์โหลด pip เพื่อดาวน์โหลดการเรียงซ้อนของการอ้างอิง (เช่นการขึ้นต่อกันของการอ้างอิง ฯลฯ ) ทุกอย่างจะทำงาน

หากคุณต้องการใช้ดัชนี pypi หากสามารถเข้าถึงได้ แต่กลับไปใช้ล้อท้องถิ่นหากไม่ใช้คุณสามารถลบ--no-indexและเพิ่ม--retries 0ได้ คุณจะเห็น pip หยุดชั่วคราวสักครู่ในขณะที่พยายามตรวจสอบ pypi สำหรับการพึ่งพาที่ขาดหายไป (ไม่ได้ติดตั้งไว้) และเมื่อพบว่าไม่สามารถเข้าถึงได้จะกลับสู่ท้องถิ่น ดูเหมือนจะไม่มีวิธีบอก pip ให้ "มองหาคนท้องถิ่นก่อนแล้วตามด้วยดัชนี"


-1

ฉันพยายามที่จะทำสิ่งที่ง่ายและล้มเหลวอย่างน่าสังเวชบางทีฉันอาจจะโง่

อย่างไรก็ตามหากคุณมีสคริปต์ / Dockerfileซึ่งดาวน์โหลดไฟล์ zip ของแพคเกจหลาม (เช่นจาก GitHub) และคุณต้องการติดตั้งคุณสามารถใช้file:///คำนำหน้าเพื่อติดตั้งดังแสดงในตัวอย่างต่อไปนี้:

$ wget https://example.com/mypackage.zip
$ echo "${MYPACKAGE_MD5}  mypackage.zip" | md5sum --check -
$ pip install file:///.mypackage.zip

หมายเหตุ : ฉันรู้ว่าคุณสามารถติดตั้งแพคเกจได้ทันทีpip install https://example.com/mypackage.zipแต่ในกรณีของฉันฉันต้องการตรวจสอบการตรวจสอบ (ไม่หวาดระแวงพอ) และฉันล้มเหลวอย่างน่าสังเวชเมื่อพยายามใช้ตัวเลือกต่างๆที่ pip ให้ / #md5ชิ้นส่วน

pipมันถูกทำลายน่าแปลกใจที่จะทำบางสิ่งบางอย่างเพื่อให้ง่ายโดยตรงกับ ฉันแค่ต้องการส่งเช็คซัมและpipตรวจสอบว่ารหัสไปรษณีย์นั้นตรงกันก่อนติดตั้ง

ฉันอาจทำสิ่งที่โง่มาก แต่ในที่สุดฉันก็ยอมแพ้และเลือกสิ่งนี้ ฉันหวังว่ามันจะช่วยให้ผู้อื่นพยายามทำสิ่งที่คล้ายกัน

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