Làm cách nào để cài đặt từ thư mục con git với pip?


104

Tôi có một kho lưu trữ git với nhiều thư mục, một trong số chúng là một mô-đun python có thể cài đặt bằng pip, như sau:

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

Ngay bây giờ tôi phải làm như sau để cài đặt:

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

Có thể cài đặt mô-đun trực tiếp bằng pip mà không cần sao chép rõ ràng không?

Tôi đã thử:

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

Nhưng tôi nhận được:

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

1
Câu hỏi này dường như đã được giải đáp: stackoverflow.com/questions/10847764/pip-install-from-git-repo
synthesizerpatel

1
Câu hỏi bạn đã liên kết là về việc thiếu tệp vì không có MANIFEST.in. Câu hỏi của tôi là về cách cài đặt thư mục con bằng pip, không có tệp nào bị thiếu vì tôi có thể cài đặt gói bằng cách sao chép toàn bộ repo.
J. Martinot-Lagarde

@synthesizerpatel Câu hỏi mà bạn đã liên kết để hỏi về một thứ khác nhưng tiêu đề đã gây hiểu lầm nên tôi đã sửa lại. Bạn có thể xem xét loại bỏ (tôi đoán) phản đối của bạn.
Piotr Dobrogost

Câu trả lời:


120

Có một yêu cầu kéo liên quan đến tính năng này và nó dường như đã được hợp nhất để phát triển nhánh một tháng trước. Cú pháp như sau :

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

Chúng ta có thể phải đợi một thời gian cho đến khi nó được hợp nhất thành master và được phân phối.

CẬP NHẬT : Điều này hiện có sẵn và được ghi lại tại https://pip.readthedocs.io/en/stable/reference/pip_install/#vcs-support như sau:

Đối với các dự án mà setup.py không nằm trong thư mục gốc của dự án, thành phần "thư mục con" được sử dụng. Giá trị của thành phần "thư mục con" phải là đường dẫn bắt đầu từ thư mục gốc của dự án đến nơi đặt setup.py.

Vì vậy, nếu bố cục kho lưu trữ của bạn là:

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

Bạn sẽ cần sử dụng

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

Lưu ý: Trên Windows, bạn phải đặt URL trong dấu ngoặc kép, nếu không bạn sẽ gặp lỗi "'thư mục con' không được nhận dạng là lệnh nội bộ hoặc lệnh bên ngoài". Ví dụ: sử dụng:

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

4
Tôi vừa kiểm tra và nó là một phần của pip v1.5, phát hành ngày 1 tháng 1 năm 2014: github.com/pypa/pip/blob/develop/CHANGES.txt
tomka

20
Nếu bạn đang sử dụng ubuntu, hãy đảm bảo sử dụng dấu ngoặc kép trước vị trí git thực, nếu không thư mục & con bị bỏ qua! Ví dụ: pip install -e 'git + git.repo /… '
Lin

7
Chỉ cần lưu ý: điều này dường như không hoạt động (ít nhất là trên pip v1.5.6, không chắc về 6 phiên bản trở lên) đối với các gói có điểm vào nằm trong thư mục con. pip install -e 'git+https://…/repo.git@branch#egg=package&subdirectory=package'kết quả là gói xuất hiện để cài đặt và một package.egg-linktệp được đưa vào các gói trang - nhưng nó trỏ đến thư mục gốc của src/repo, không phải src/repo/package, như tôi mong đợi. Điều này có nghĩa là py_moduleskhông thể nhập và entry_pointskhông thực sự hoạt động: cả hai đều tăng một ImportError: No module named package.
Mark G.

2
-ecó vẻ cần thiết, nếu pip freezekhông thì không hiển thị toàn bộ đường dẫn, chỉ có quả trứng. Điều này đã xảy ra vàopip-1.5.4
zyxue

2
mẹo cho người khác: bạn PHẢI sử dụng git + https, git + git sẽ không hoạt động, bạn sẽ gặp phải lỗi nghiêm trọng: lỗi từ xa: Không tìm thấy kho lưu trữ. có lẽ vì nó không phân tích cú pháp chuỗi "truy vấn" một cách chính xác. Tôi vừa đăng nhập: github.com/pypa/pip/issues/4898
amohr

33

Nó đã được nêu trong một trong các nhận xét dưới câu trả lời đúng, nhưng chỉ để làm nổi bật vấn đề này: khi thực hiện điều này từ dòng lệnh Linux, bạn phải thoát khỏi &-character vì ký hiệu và đang yêu cầu dòng lệnh chạy một lệnh trong nền:

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

Chú ý dấu gạch chéo ngược trước dấu và. Hành vi thoát có thể phụ thuộc vào bản phân phối Linux; Tôi không phải là một chuyên gia.
Nếu bạn bỏ qua điều này, bạn có thể gặp phải một lỗi khó hiểu như sau:

bash: (...) command not found

1
Việc đặt url trong dấu ngoặc kép có giúp tránh phải thoát ký hiệu và không? Tôi biết điều đó rất hữu ích khi làm việc với các URL trong cURL.
Josh Peak

1
Cũng cần lưu ý: Khi thực hiện điều này từ dòng lệnh Windows, bạn phải đặt URL trong dấu ngoặc kép, nếu không bạn sẽ gặp lỗi "'thư mục con' không được nhận dạng là lệnh nội bộ hoặc lệnh bên ngoài". Ví dụ: sử dụng pip install -e "git + myurl / proj # egg = subpkg & subdirectory =

Nói chung, khi làm việc với các tập lệnh shell, hãy sử dụng dấu ngoặc kép xung quanh các đối số để an toàn. để biết thêm thông lệ tốt nhất xem: shellcheck.net hoặc github.com/koalaman/shellcheck
Erik Aronesty

2
Các thoát là cần thiết trong OSX cũng (vì nó là một loại distro Linux)
ygesher

6
Để sử dụng cài đặt dựa trên chi nhánh:pip install git+ssh://git@github.com/org_or_username/repo.git@branch#subdirectory=path/to/dubdir
RDK
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.