Bagaimana cara menginstal dari subdirektori git dengan pip?

107

Saya memiliki repositori git dengan banyak folder, salah satunya adalah modul python yang dapat diinstal dengan pip, seperti ini:

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

Sekarang saya harus melakukan hal berikut untuk menginstal:

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

Apakah mungkin untuk menginstal modul secara langsung dengan pip tanpa kloning secara eksplisit?

Saya mencoba:

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

Tapi saya mendapatkan:

IOError: [Errno 2] No such file or directory: '/tmp/pip-88tlLm-build/setup.py'
J. Martinot-Lagarde
sumber
1
Pertanyaan ini sepertinya sudah terjawab: stackoverflow.com/questions/10847764/pip-install-from-git-repo
synthesizerpatel
1
Pertanyaan yang Anda tautkan adalah tentang file yang hilang karena tidak ada MANIFEST.in. Pertanyaan saya adalah tentang bagaimana menginstal subdirektori dengan pip, tidak ada file yang hilang karena saya dapat menginstal paket dengan mengkloning seluruh repo.
J. Martinot-Lagarde
@synthesizerpatel Pertanyaan yang Anda tautkan menanyakan tentang hal yang berbeda tetapi judulnya menyesatkan jadi saya memperbaikinya. Anda dapat mempertimbangkan untuk menghapus (saya kira) suara negatif Anda.
Piotr Dobrogost

Jawaban:

126

Ada permintaan tarik terkait fitur ini, dan tampaknya telah digabungkan untuk mengembangkan cabang sebulan yang lalu. Sintaksnya adalah sebagai berikut :

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

Kami mungkin harus menunggu beberapa saat hingga digabungkan menjadi master dan didistribusikan.

PEMBARUAN : Ini sekarang tersedia dan didokumentasikan di https://pip.readthedocs.io/en/stable/reference/pip_install/#vcs-support sebagai berikut:

Untuk proyek di mana setup.py tidak berada di root proyek, komponen "subdirektori" digunakan. Nilai komponen "subdirektori" harus berupa jalur yang dimulai dari akar proyek ke tempat setup.py berada.

Jadi jika tata letak repositori Anda adalah:

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

Anda harus menggunakan

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

Catatan: Pada Windows, Anda harus menempatkan URL dalam tanda kutip ganda, atau Anda akan mendapatkan kesalahan "'subdirektori' tidak dikenali sebagai perintah internal atau eksternal". Misalnya, gunakan:

pip install -e "vcs+protocol://repo_url#egg=pkg&subdirectory=pkg_dir"
Dennis Golomazov
sumber
4
Saya baru saja memeriksa dan itu adalah bagian dari pip v1.5, dirilis 1 Jan 2014: github.com/pypa/pip/blob/develop/CHANGES.txt
tomka
20
Jika Anda menggunakan ubuntu pastikan untuk menggunakan tanda kutip tunggal sebelum lokasi git sebenarnya, jika tidak, subdirektori & akan diabaikan! Misalnya: pip install -e 'git + git.repo /… '
Lin
8
Sekadar pemberitahuan: ini tampaknya tidak berfungsi (setidaknya pada pip v1.5.6, tidak yakin tentang 6+ versi) untuk paket yang titik masuknya terletak di dalam subdirektori. pip install -e 'git+https://…/repo.git@branch#egg=package&subdirectory=package'menghasilkan paket yang tampak diinstal, dan package.egg-linkfile dimasukkan ke dalam paket situs - tetapi mengarah ke direktori root src/repo, bukan ke src/repo/package, seperti yang saya harapkan. Ini berarti py_modulestidak dapat diimpor, dan entry_pointstidak benar-benar berfungsi: keduanya menaikkan file ImportError: No module named package.
Mark G.
2
-etampaknya perlu, jika pip freezetidak, tidak menunjukkan seluruh jalur, hanya telurnya. Ini terjadi padapip-1.5.4
zyxue
2
tip untuk orang lain: Anda HARUS menggunakan git + https, git + git tidak akan berfungsi, Anda akan berakibat fatal: kesalahan jarak jauh: Repositori tidak ditemukan. mungkin karena tidak mengurai string "kueri" dengan benar. Saya baru saja masuk: github.com/pypa/pip/issues/4898
amohr
33

Ini sudah dinyatakan di salah satu komentar di bawah jawaban yang benar, tetapi hanya untuk menyoroti masalah ini: saat menjalankan ini dari baris perintah Linux, Anda harus keluar dari &-karakter karena ampersand memberi tahu baris perintah untuk menjalankan perintah di latar belakang:

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

Perhatikan garis miring terbalik sebelum tanda ampersand. Perilaku melarikan diri mungkin bergantung pada distro Linux; Saya bukan seorang ahli.
Jika Anda mengabaikan ini, Anda mungkin mengalami kesalahan samar seperti berikut:

bash: (...) command not found
rinderwahn
sumber
1
Akankah menyertakan url dalam tanda kutip tunggal membantu menghindari keharusan untuk mengosongkan ampersand? Saya tahu itu berguna saat bekerja dengan URL di cURL.
Josh Peak
1
Juga perlu diperhatikan: Saat menjalankan ini dari baris perintah Windows, Anda harus menempatkan URL dalam tanda kutip ganda, atau Anda akan mendapatkan kesalahan "'subdirektori' tidak dikenali sebagai perintah internal atau eksternal". Misalnya, gunakan pip install -e "git + myurl / proj # egg = subpkg & subdirectory = subdir "
Secara umum, saat bekerja dengan skrip shell, gunakan tanda kutip ganda di sekitar argumen agar aman. untuk lebih banyak praktik terbaik lihat: shellcheck.net atau github.com/koalaman/shellcheck
Erik Aronesty
2
Escaping juga diperlukan di OSX (karena ini adalah semacam distro Linux)
ygesher
6
Untuk penggunaan penginstalan berbasis cabang:pip install git+ssh://[email protected]/org_or_username/repo.git@branch#subdirectory=path/to/dubdir
RDK