ฉันจะทำให้ setuptools ติดตั้งแพ็คเกจที่ไม่ได้อยู่ใน PyPI ได้อย่างไร


142

ฉันเพิ่งเริ่มทำงานกับ setuptools และ virtualenv แพ็คเกจของฉันต้องการ python-gearman ล่าสุดที่พร้อมใช้งานจาก GitHub เท่านั้น รุ่น python-gearman ที่อยู่ใน PyPI นั้นเป็นรุ่นเก่า แหล่งที่มาของ Github นั้นรองรับการใช้งาน setuptools เช่นมี setup.py เป็นต้นมีวิธีที่จะทำให้ setuptools ทำการดาวน์โหลดและติดตั้งเวอร์ชั่นใหม่แทนที่จะมองหาบน PyPI และติดตั้งเก่าหรือไม่?

FYI, python-gearman ใหม่คือhttp://github.com/mtai/python-gearman


1
มีเหตุผลที่คุณพยายามติดตั้งแพ็กเกจหลามโดยตรงจาก Git แทนที่จะดาวน์โหลดจากที่นั่นและใช้python setup.py installในไดเรกทอรีต้นทางหรือไม่?
แอนดรู

4
ฉันต้องการให้นำแพคเกจของฉันไปใช้กับหลายเครื่องและติดตั้งการพึ่งพาทั้งหมดโดยอัตโนมัติ
อังเดร

2
คุณสามารถใช้easy_installหรือpipเพื่อติดตั้งโดยตรงจาก Github แต่ยังมีวิธีแก้ไขปัญหาอื่นคุณพิจารณาเพิ่มแพ็คเกจไปยัง PyPI หรือไม่
Wolph

2
เพราะมันเป็นเพียงสำหรับการใช้งานทำไมไม่ใช้buildout? มันมีปลั๊กอิน Git สำเร็จรูปสองสามตัว
Wolph

วิธีแก้ปัญหาที่นี่: stackoverflow.com/a/17442663/1841871
zazabe

คำตอบ:


156

กุญแจสำคัญคือบอก easy_install ที่สามารถดาวน์โหลดแพ็คเกจได้ ในกรณีนี้โดยเฉพาะก็สามารถพบได้ที่ URL http://github.com/mtai/python-gearman/tarball/master อย่างไรก็ตามลิงก์นั้นไม่สามารถใช้งานได้เนื่องจาก easy_install ไม่สามารถบอกได้เพียงแค่ดูที่ URL ว่าจะได้รับอะไร

โดยเปลี่ยนเป็นhttp://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0betaแทน easy_install จะสามารถระบุชื่อแพ็กเกจและเวอร์ชันของมันได้

ขั้นตอนสุดท้ายคือการเพิ่ม URL ไปยัง dependency_links ของแพ็คเกจของคุณเช่น:

setup(
   ...
   dependency_links = ['http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta']
)

ตอนนี้เมื่อแพ็คเกจของคุณถูกติดตั้ง easy_install จะพบว่ามี "gearman 2.0.0beta" พร้อมให้ดาวน์โหลดจาก URL นั้นและเลือกมันอย่างมีความสุขบน PyPI ถ้าคุณระบุ "gearman> = 2.0.0beta" ในการพึ่งพาของคุณ ..

(โดยปกติวิธีการเรียงลำดับของสิ่งนี้คือการรวมลิงค์ในหน้า PyPI ของตัวเองไปยังแหล่งดาวน์โหลดในกรณีนี้หากผู้แต่งชุดเกียร์มีลิงค์ดังกล่าวข้างต้นคุณจะถูกตั้งค่าไว้แล้ว โดยทั่วไปแล้วผู้คนทำเครื่องหมายรุ่นพัฒนาด้วย 'myproject-dev' และจากนั้นผู้คนใช้ความต้องการของ 'myproject> = somever, == dev' ดังนั้นหากไม่มีแพ็คเกจใด ๆ หรือสูงกว่า easy_install จะพยายาม ตรวจสอบหรือดาวน์โหลดรุ่น)

คุณจะต้องระบุเมื่อใช้--process-dependency-links pipโปรดทราบว่าการประมวลผลลิงก์ที่อ้างอิงได้เลิกใช้แล้วและจะถูกลบออกในอนาคต


1
ฉันทำสิ่งที่คุณแนะนำ แต่เมื่อฉันเรียกใช้ "python setup.py พัฒนา" มันบอกว่า "กำลังเขียน dependency_links ไปยัง foo.egg-info / dependency_links.txt" แต่ไม่ได้ดาวน์โหลดและติดตั้งแพคเกจ ฉันใช้ virtualenv ที่ใช้ setuptools เป็นตัวช่วย
อังเดร

15
คุณต้องมี install_requires = 'gearman> = 2.0.0beta'; คุณรวมถึงสิ่งนั้นหรือไม่
PJ Eby

3
มันไม่ทำงานสำหรับฉันที่มีbetaต่อท้ายในรุ่นที่มีอยู่ใน PyPI ก็ยังจะติดตั้งแพคเกจจาก PyPI dependency_linksแทนหนึ่งที่กำหนดไว้ใน หากคุณพยายามตั้งค่ารุ่นที่สูงกว่าที่มีอยู่ใน PyPI ด้วย#egg=package-versionเครื่องมือการตั้งค่าจะบ่นกับCould not find a version that satisfies the requirementข้อผิดพลาดและรายการทุกรุ่นที่มีอยู่ใน PyPI โปรดทราบว่าฉันพยายามที่จะสร้างแพคเกจของฉันด้วยแล้วติดตั้งด้วยsdist pip install http://url/to/my/generated/tar
zazabe

1
ตกลงโดยติดตั้งแพคเกจของฉันeasy_install http://url/to/my/generated/tarทุกอย่างทำงานเหมือนที่คาดไว้ ... ความคิดใดทำไม
zazabe

3
--process-dependency-linksถูกลบออกจากpip19! ดู: github.com/pypa/pip/issues/6162
phoenix

67

คุณสามารถใช้pip install protocol+location[@tag][#egg=Dependency]รูปแบบเพื่อติดตั้งจากแหล่งโดยตรงโดยใช้ pip

Git

pip install git+https://github.com/username/repo.git
pip install git+https://github.com/username/repo.git@MyTag
pip install git+https://github.com/username/repo.git@MyTag#egg=ProjectName

หลายใจ

pip install hg+https://hg.myproject.org/MyProject/

SVN

pip install svn+svn://svn.myproject.org/svn/MyProject

bzr

pip install bzr+http://bzr.myproject.org/MyProject/trunk

รองรับโปรโตคอลต่อไปนี้: [+git, +svn, +hg, +bzr]

รุ่น

@tag ช่วยให้คุณระบุรุ่น / แท็กเฉพาะเพื่อตรวจสอบ

#egg=name ช่วยให้คุณระบุว่าโครงการใดเป็นที่พึ่งพิงของผู้อื่น

@tag#egg=nameการสั่งซื้อที่จะต้องเสมอ

ที่เก็บส่วนตัว

คุณสามารถติดตั้งจากที่เก็บส่วนตัวโดยเปลี่ยนโปรโตคอลเป็น SSH ( ssh://) และเพิ่มผู้ใช้ที่เหมาะสม ( git@):

git+ssh://git@github.com/username/my_private_repo

คุณสามารถติดตั้งจากที่เก็บส่วนตัวด้วยชื่อผู้ใช้ / รหัสผ่าน

git+https://<username>:<password>@github.com/<user>/<repo>.git

Github มอบความสามารถในการสร้างโทเค็น OAuth ส่วนบุคคลซึ่งสามารถขี่จักรยานได้

git+https://<oauth token>:x-oauth-basic@github.com/<user>/<repo>.git

requirements.txt

requirements.txt ใช้เพื่อระบุการขึ้นต่อกันของโครงการ:

requirements.txt

package1
package2==1.0.2
package3>=0.0.4
git+https://github.com/username/repo.git

pip -r requirements.txtเหล่านี้ไม่ได้ติดตั้งโดยอัตโนมัติกับแพคเกจและจะต้องติดตั้งกับคำสั่ง

รวมถึงไฟล์ข้อกำหนด

ไฟล์ข้อกำหนดสามารถรวมไฟล์ข้อกำหนดอื่น ๆ :

ความต้องการ docs.txt

sphinx
-r requirements-dev.txt

ความต้องการ dev.txt

some-dev-tool
-r requirements.txt

requirements.txt

package1
package2==1.0.2
package3>=0.0.4
git+https://github.com/username/repo.git

setup.py

ไฟล์ข้อกำหนดสามารถติดตั้งการอ้างอิงที่ระบุsetup.pyด้วยคำสั่งต่อไปนี้:

-e .

setup.pyยังสามารถติดตั้งจากที่เก็บโดยใช้ไวยากรณ์เดียวกันกับข้างต้น แต่ใช้dependency_linksค่าตามที่กล่าวไว้ในคำตอบนี้

อ้างอิง:

https://pip.pypa.io/th/latest/user_guide.html#installing-packages https://pip.pypa.io/en/latest/reference/pip_install.html


2
setup.py สามารถติดตั้งได้จากที่เก็บ เพียงค้นหา 'setup.py dependency_links'
TomDotTom

1
@TomDotTom Derp ฉันยัง upvoted คำตอบนั้น แต่อย่างใดไม่ได้ดูดมัน = P ฉันจะปรับปรุงคำตอบของฉัน ขอบคุณสำหรับการชี้ให้เห็น! มันจะช่วยออกบางสิ่งที่ฉันทำ
Rebs

dependency_links ฉันคิดว่ากำลังคิดค่าเสื่อมราคาแม้ว่า (?) github.com/pypa/pip/issues/3939 github.com/pypa/pip/issues/3939ฉันรักคำตอบนี้และคิดว่ามันจะดีกว่าเนื่องจากความสามารถ (ใน setup.py):extras_require={'all': [repo @ git+https://github.com/username/repo.git]}
Josiah L.

21

ขณะที่ผมเพิ่งมีการทำในสิ่งเดียวกันผมพบวิธีที่จะทำเช่นนี้อีกpip's --process-dependency-linksมีกำหนดที่จะถูกลบออกในpip19.0 ตามความคิดเห็นนี้

pip 18.1 มีคุณสมบัติดังต่อไปนี้

อนุญาตให้ใช้ข้อกำหนด PEP 508 URL เป็นการอ้างอิง

จากคำอธิบายของ PEP 508 ไวยากรณ์สำหรับการอ้างอิง URL ดังกล่าวมีลักษณะดังนี้:

การค้นหา URL ขั้นต่ำ:

pip @ https://github.com/pypa/pip/archive/1.3.1.zip#sha1=da9234ee9982d4bbb3c72346a6de940a148ea686

ดังนั้นในของคุณsetup.pyมันจะดูเหมือน

setup(
   ...
   install_requires = [
   ...
   'python-gearman @ https://github.com/mtai/python-gearman/archive/master.zip'
   ...
   ]
)

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

ความรู้ของฉันที่ดีที่สุดวิธีที่ง่ายที่สุดในการอัปเดตการอ้างอิงคือการใช้pip install -I .เมื่อติดตั้งแพ็กเกจของคุณจากไดเรกทอรี


สิ่งนี้ยังรองรับทุกสิ่งที่pip installสนับสนุนเช่น git URL #subdirectory=...ฯลฯ ด้วยหรือไม่ หรือว่าพวกเขามาพร้อมกับซินแท็กซ์ใหม่ล่าสุดที่มีฟีเจอร์ต่าง ๆ ที่เปิดเผยในวิธีที่แตกต่างและเข้ากันไม่ได้?
remram

หากคุณไม่ได้ใช้ setuptools และจัดการการพึ่งพาตนเองในบรรทัดคำสั่งดูเหมือนว่าคุณยังคงต้องใช้วิธีการที่อธิบายไว้โดยคำตอบ @Rebs'
ฟิล

1
เพียงเพื่อยืนยันงานนี้กับdistutils.core.setupและpip 19.1.1
shouldsee

อย่างไรก็ตามผลลัพธ์requirements.txtไม่สามารถใช้งานได้กับpip install -r requirments.txt
shouldsee

@ shouldsee requirments.txtคุณหมายถึงอะไร
Phil

6

วานิลลาsetuptoolsไม่รองรับการดาวน์โหลดโดยตรงจากแหล่งเก็บข้อมูล git แต่คุณสามารถใช้ลิงค์ดาวน์โหลดแหล่งข้อมูลจากหน้าดังกล่าวเช่น:

easy_install http://github.com/mtai/python-gearman/tarball/master

ดังนั้นเพื่อให้แน่ใจว่า python-gearman รุ่นนี้ได้รับการติดตั้งบนเซิร์ฟเวอร์ใด ๆ ที่แพ็คเกจของฉันจะเป็นฉันจะต้องเรียกใช้ easy_install ด้วยตนเองก่อนติดตั้งแพ็กเกจของฉัน
อังเดร

หากคุณใช้ easy_install ใช่ แต่อย่างที่คนอื่น ๆ ชี้คุณสามารถเปลี่ยนไปใช้pipหรือbuildoutมีการจัดการความต้องการที่ซับซ้อนมากขึ้น ดูตัวอย่าง: pip.openplans.org/#requirements-files
Ned Deily

ที่จริงแล้วคุณไม่จำเป็นต้องเรียกใช้ easy_install ด้วยตนเอง คุณสามารถเพิ่มลิงค์พิเศษใน setup.py ของคุณ ฉันจะเขียนคำตอบเพื่ออธิบายรายละเอียด
PJ Eby

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