ฉันจะติดตั้งจากไดเร็กทอรีย่อย git ด้วย pip ได้อย่างไร


108

ฉันมีที่เก็บ git ที่มีหลายโฟลเดอร์หนึ่งในนั้นเป็นโมดูล python ที่ติดตั้งได้ด้วย pip เช่นนี้:

repo.git/
repo.git/folder1/
repo.git/folder2/
repo.git/mymodule/
repo.git/mymodule/__init__.py
repo.git/mymodule/setup.py
repo.git/mymodule/...

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

git clone http://server/repo.git
cd repo
pip install mymodule
cd ..
rm -rf repo

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

ฉันเหนื่อย:

pip install git+https://server/repo.git/mymodule/
pip install git+https://server/repo.git:mymodule/

แต่ฉันได้รับ:

IOError: [Errno 2] No such file or directory: '/tmp/pip-88tlLm-build/setup.py'

1
คำถามนี้ดูเหมือนจะได้รับคำตอบแล้ว: stackoverflow.com/questions/10847764/pip-install-from-git-repo
synthesizerpatel

1
คำถามที่คุณเชื่อมโยงเกี่ยวกับไฟล์ที่หายไปเนื่องจากไม่มี MANIFEST.in คำถามของฉันเกี่ยวกับวิธีการติดตั้งไดเร็กทอรีย่อยด้วย pip ไม่มีไฟล์ใดหายไปเนื่องจากฉันสามารถติดตั้งแพ็กเกจได้โดยการโคลน repo ทั้งหมด
J. Martinot-Lagarde

@synthesizerpatel คำถามที่คุณเชื่อมโยงถามเกี่ยวกับสิ่งที่แตกต่างกัน แต่ชื่อเรื่องทำให้เข้าใจผิดดังนั้นฉันจึงแก้ไข คุณสามารถพิจารณาลบ (ฉันเดา) การลงคะแนนของคุณ
Piotr Dobrogost

คำตอบ:


127

มีคำขอดึงเกี่ยวกับคุณลักษณะนี้และดูเหมือนว่าจะมีการรวมเข้าด้วยกันเพื่อพัฒนาสาขาเมื่อเดือนที่แล้ว ไวยากรณ์มีดังต่อไปนี้ :

pip install -e git+https://git.repo/some_repo.git#egg=version_subpkg&subdirectory=repo # install a python package from a repo subdirectory

เราอาจต้องรอสักครู่จนกว่าจะรวมเข้าด้วยกันเพื่อเชี่ยวชาญและแจกจ่าย

อัปเดต : ตอนนี้พร้อมใช้งานและบันทึกไว้ที่https://pip.readthedocs.io/en/stable/reference/pip_install/#vcs-supportดังต่อไปนี้:

สำหรับโปรเจ็กต์ที่ setup.py ไม่ได้อยู่ในรูทของโปรเจ็กต์จะใช้คอมโพเนนต์ "ไดเร็กทอรีย่อย" ค่าของคอมโพเนนต์ "ไดเร็กทอรีย่อย" ควรเป็นเส้นทางที่เริ่มต้นจากรูทของโปรเจ็กต์ไปยังตำแหน่งที่ setup.py ตั้งอยู่

ดังนั้นหากเค้าโครงที่เก็บของคุณคือ:

- pkg_dir/
  - setup.py  # setup.py for package ``pkg``
  - some_module.py
- other_dir/
  - some_file
- some_other_file

คุณจะต้องใช้

pip install -e vcs+protocol://repo_url/#egg=pkg&subdirectory=pkg_dir

หมายเหตุ: ใน Windows คุณต้องวาง URL ไว้ในเครื่องหมายอัญประกาศไม่เช่นนั้นคุณจะได้รับข้อผิดพลาด "" ไดเรกทอรีย่อย "ไม่ได้รับการยอมรับว่าเป็นคำสั่งภายในหรือภายนอก" เช่นใช้:

pip install -e "vcs+protocol://repo_url#egg=pkg&subdirectory=pkg_dir"

4
ฉันเพิ่งตรวจสอบและเป็นส่วนหนึ่งของ pip v1.5 วางจำหน่าย 1 มกราคม 2014: github.com/pypa/pip/blob/develop/CHANGES.txt
tomka

20
หากคุณใช้อูบุนตูอย่าลืมใช้เครื่องหมายคำพูดเดี่ยวก่อนตำแหน่งคอมไพล์จริงมิฉะนั้น & ไดเรกทอรีย่อยจะถูกละเว้น! ตัวอย่างเช่น pip install -e 'git + git.repo / … '
Lin

8
เพียงแค่การแจ้งเตือน: สิ่งนี้ดูเหมือนจะใช้ไม่ได้ (อย่างน้อยใน pip v1.5.6 ไม่แน่ใจเกี่ยวกับเวอร์ชัน 6+) สำหรับแพ็กเกจที่มีจุดเข้าอยู่ภายในไดเร็กทอรีย่อย pip install -e 'git+https://…/repo.git@branch#egg=package&subdirectory=package'ผลในแพคเกจที่ปรากฏในการติดตั้งและpackage.egg-linkไฟล์ที่ได้รับการใส่ในเว็บไซต์แพคเกจ - แต่มันชี้ไปที่ไดเรกทอรีรากของsrc/repo, ไม่เพื่อsrc/repo/packageที่ผมจะคาดหวัง ซึ่งหมายความว่าpy_modulesไม่สามารถนำเข้าและใช้งานentry_pointsไม่ได้จริง: ทั้งคู่เพิ่มImportError: No module named packageไฟล์.
Mark G.

2
-eดูเหมือนจำเป็นมิฉะนั้นpip freezeจะไม่แสดงเส้นทางทั้งหมดมีเพียงไข่เท่านั้น สิ่งนี้เกิดขึ้นเมื่อpip-1.5.4
zyxue

2
เคล็ดลับสำหรับผู้อื่น: คุณต้องใช้ git + https, git + git จะไม่ทำงานคุณจะได้รับอันตรายถึงชีวิต: ข้อผิดพลาดระยะไกล: ไม่พบที่เก็บ น่าจะเป็นเพราะไม่ได้แยกวิเคราะห์สตริง "query" อย่างถูกต้อง ฉันเพิ่งเข้าสู่ระบบ: github.com/pypa/pip/issues/4898
amohr

33

มีการระบุไว้แล้วในหนึ่งในความคิดเห็นภายใต้คำตอบที่ถูกต้อง แต่เพียงเพื่อเน้นปัญหานี้: เมื่อดำเนินการจากบรรทัดคำสั่ง Linux คุณต้องหลีกเลี่ยง&-character เนื่องจากเครื่องหมายแอมเพอร์แซนด์กำลังบอกให้บรรทัดคำสั่งรันคำสั่งในพื้นหลัง:

git+https://git.repo/some_repo.git#egg=version_subpkg\&subdirectory=repo

สังเกตแบ็กสแลชก่อนเครื่องหมายแอมเพอร์แซนด์ พฤติกรรมการหลบหนีอาจขึ้นอยู่กับ distro ของ Linux ฉันไม่ใช่ผู้เชี่ยวชาญ
หากคุณไม่สนใจสิ่งนี้คุณอาจพบข้อผิดพลาดที่เป็นความลับดังต่อไปนี้:

bash: (...) command not found

1
การใส่ url ในเครื่องหมายคำพูดเดี่ยวจะช่วยหลีกเลี่ยงความจำเป็นในการหลีกเลี่ยงเครื่องหมายแอมเพอร์แซนด์หรือไม่? ฉันรู้ว่ามีประโยชน์เมื่อทำงานกับ URL ใน cURL
Josh Peak

1
สิ่งที่ควรทราบ: เมื่อดำเนินการจากบรรทัดคำสั่งของ Windows คุณต้องวาง URL ไว้ในเครื่องหมายอัญประกาศไม่เช่นนั้นคุณจะได้รับข้อผิดพลาด "" ไดเรกทอรีย่อย "ไม่รู้จักเป็นคำสั่งภายในหรือภายนอก เช่นใช้ pip install -e "git + myurl / proj # egg = subpkg & subdirectory = subdir "

โดยทั่วไปเมื่อทำงานกับเชลล์สคริปต์ให้ใช้เครื่องหมายคำพูดคู่รอบอาร์กิวเมนต์เพื่อให้อยู่ในด้านที่ปลอดภัย สำหรับแนวทางปฏิบัติที่ดีที่สุดเพิ่มเติมโปรดดู: shellcheck.netหรือgithub.com/koalaman/shellcheck
Erik Aronesty

2
การหลบหนีเป็นสิ่งที่จำเป็นใน OSX เช่นกัน (เนื่องจากเป็น Linux distro ประเภทหนึ่ง)
ygesher

6
สำหรับการใช้งานการติดตั้งตามสาขา:pip install git+ssh://git@github.com/org_or_username/repo.git@branch#subdirectory=path/to/dubdir
RDK
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.