Bagaimana saya bisa membuat setuptools menginstal paket yang tidak ada di PyPI?

142

Saya baru saja mulai bekerja dengan setuptools dan virtualenv. Paket saya membutuhkan python-gearman terbaru yang hanya tersedia dari GitHub. Versi python-gearman yang ada di PyPI adalah versi lama. Sumber Github kompatibel dengan setuptools, yaitu memiliki setup.py, dll. Apakah ada cara untuk membuat setuptools mengunduh dan menginstal versi baru alih-alih mencarinya di PyPI dan menginstal yang lama?

FYI, python-gearman baru adalah http://github.com/mtai/python-gearman

andrei
sumber
1
Apakah ada alasan Anda mencoba menginstal paket python langsung dari Git daripada mengunduh sumber dari sana dan menggunakannya python setup.py installdi direktori sumber?
Andrew
4
Saya ingin paket saya digunakan pada beberapa mesin dan semua dependensinya diinstal secara otomatis.
andrei
2
Anda dapat menggunakan easy_installatau pipmenginstalnya langsung dari Github. Tetapi ada juga solusi lain, sudahkah Anda mempertimbangkan untuk menambahkan paket ke PyPI?
Wolph
2
Karena ini hanya untuk penyebaran, mengapa tidak digunakan buildout? Ini memiliki beberapa plugin Git yang sudah jadi.
Wolph
solusi di sini: stackoverflow.com/a/17442663/1841871
zazabe

Jawaban:

156

Kuncinya adalah memberi tahu easy_install di mana paket itu dapat diunduh. Dalam kasus khusus ini, dapat ditemukan di url http://github.com/mtai/python-gearman/tarball/master . Namun, tautan itu sendiri tidak akan berfungsi, karena easy_install tidak dapat memberi tahu hanya dengan melihat URL apa yang akan didapat.

Dengan mengubahnya ke http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta sebagai gantinya, easy_install akan dapat mengidentifikasi nama paket dan versinya.

Langkah terakhir adalah menambahkan URL ke dependency_links paket Anda, misalnya:

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

Sekarang, ketika paket ANDA sedang diinstal, easy_install akan menemukan bahwa ada "gearman 2.0.0beta" yang tersedia untuk diunduh dari URL itu, dan dengan senang hati mengambilnya dari yang ada di PyPI, jika Anda menentukan "gearman> = 2.0.0beta" dalam dependensi Anda ..

(Biasanya, cara hal semacam ini dilakukan adalah dengan memasukkan tautan pada halaman PyPI seseorang ke sumber yang dapat diunduh; dalam hal ini, jika pembuat paket gearman menyertakan tautan seperti di atas, Anda akan sudah menyetel Biasanya, orang menandai versi pengembangan dengan 'myproject-dev' dan kemudian orang menggunakan persyaratan 'myproject> = somever, == dev', sehingga jika tidak ada paket yang lebih tinggi, easy_install akan mencoba untuk lihat atau unduh rilisnya.)

Anda harus menentukan --process-dependency-linkssaat menggunakan pip. Perhatikan bahwa pemrosesan tautan ketergantungan telah usang dan akan dihapus dalam rilis yang akan datang.

PJ Eby
sumber
1
Saya melakukan apa yang Anda sarankan, tetapi ketika saya menjalankan "python setup.py develop", dikatakan "menulis dependency_links ke foo.egg-info / dependency_links.txt", tetapi tidak benar-benar mengunduh dan menginstal paket. Saya menggunakan virtualenv berbasis setuptools jika itu membantu.
andrei
15
Anda juga harus memiliki install_requires = 'gearman> = 2.0.0beta'; apakah anda memasukkan itu?
PJ Eby
3
Ini tidak berfungsi untuk saya, dengan betaakhiran pada versi yang ada pada PyPI, masih akan menginstal paket dari PyPI bukan yang didefinisikan dalam dependency_links. Jika Anda mencoba mengatur versi yang lebih tinggi dari yang ada di PyPI #egg=package-version, alat penyetelan akan mengeluh dengan Could not find a version that satisfies the requirementkesalahan dan daftar semua versi yang tersedia di PyPI. Perhatikan bahwa saya mencoba membangun paket saya sdist, lalu memasangnya pip install http://url/to/my/generated/tar.
zazabe
1
ok, dengan menginstal paket saya dengan easy_install http://url/to/my/generated/tar, semuanya berfungsi seperti yang diharapkan ... Tahu kenapa?
zazabe
3
--process-dependency-linkstelah dihapus pada pip19! Lihat: github.com/pypa/pip/issues/6162
phoenix
67

Anda dapat menggunakan pip install protocol+location[@tag][#egg=Dependency]format untuk menginstal langsung dari sumber menggunakan 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

Lincah

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

Protokol berikut didukung: [+git, +svn, +hg, +bzr]

Versi

@tag memungkinkan Anda menentukan versi / tag tertentu untuk diperiksa.

#egg=name memungkinkan Anda menentukan apa proyek itu sebagai ketergantungan bagi orang lain.

Urutannya harus selalu @tag#egg=name.

Repositori Pribadi

Anda juga dapat menginstal dari repositori pribadi dengan mengubah protokol ke SSH ( ssh://) dan menambahkan pengguna yang sesuai ( git@):

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

Anda juga dapat menginstal dari repositori pribadi dengan nama pengguna / kata sandi.

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

Github menyediakan kemampuan untuk membuat token OAuth pribadi yang dapat didaur ulang

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

requirement.txt

requirements.txt digunakan untuk menentukan dependensi proyek:

requirement.txt

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

Ini tidak diinstal secara otomatis dengan paket dan harus diinstal dengan perintah pip -r requirements.txt.

Termasuk file persyaratan

File persyaratan dapat termasuk file persyaratan lain:

persyaratan-docs.txt

sphinx
-r requirements-dev.txt

persyaratan-dev.txt

some-dev-tool
-r requirements.txt

requirement.txt

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

setup.py

File persyaratan dapat menginstal dependensi yang ditentukan setup.pydengan perintah berikut:

-e .

setup.pyjuga dapat menginstal dari repositori menggunakan sintaksis yang sama seperti di atas, tetapi menggunakan dependency_linksnilai seperti yang disebutkan dalam jawaban ini .

Referensi:

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

Rebs
sumber
2
setup.py BISA menginstal dari repositori. Cukup cari 'setup.py dependency_links'
TomDotTom
1
@TomDotTom Derp, saya bahkan membatalkan jawaban itu tetapi entah bagaimana tidak mengasimilasinya = P Saya akan memperbarui jawaban saya. Terima kasih telah menunjukkannya! Ini akan membantu beberapa hal yang saya lakukan.
Rebs
dependency_links saya pikir sedang disusutkan (?) github.com/pypa/pip/issues/3939 . Saya suka jawaban ini dan berpikir itu lebih baik karena bisa (dalam setup.py):extras_require={'all': [repo @ git+https://github.com/username/repo.git]}
Josiah L.
21

Seperti yang saya hanya harus melakukan hal yang sama, saya menemukan cara lain untuk melakukan hal ini sebagai pip's --process-dependency-linksdijadwalkan untuk dihapus di pip19,0 menurut komentar ini .

pip 18.1 termasuk fitur berikut

Izinkan persyaratan URL PEP 508 untuk digunakan sebagai dependensi.

Dari uraian PEP 508, sintaks untuk dependensi URL tersebut terlihat seperti:

Pencarian berbasis URL minimal:

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

Jadi di dalam kamu setup.pyakan terlihat seperti

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

Perhatikan, tautannya adalah file arsip dan juga bisa berupa rilis atau cabang tertentu dari repositori seperti yang dijelaskan dalam jawaban ini . Juga, lihat jawaban itu untuk bekerja dengan host repositori lainnya.

Sepengetahuan saya, cara termudah untuk memperbarui dependensi adalah dengan menggunakan pip install -I .ketika menginstal paket Anda dari direktori.

Phil
sumber
Apakah ini juga mendukung semua yang pip installmendukung, seperti URL git, #subdirectory=...dll? Atau apakah mereka menghasilkan sintaks baru dengan fitur berbeda yang diekspos dengan cara yang berbeda dan tidak kompatibel?
remram
Jika Anda tidak menggunakan setuptools dan mengelola dependensi secara manual pada baris perintah, sepertinya Anda masih harus menggunakan pendekatan yang dijelaskan oleh jawaban @Rebs .
Phil
1
Hanya untuk mengkonfirmasi ini berfungsi dengan distutils.core.setupdanpip 19.1.1
seharusnya lihat
Hasilnya requirements.txt, bagaimanapun, tidak kompatibel denganpip install -r requirments.txt
shouldsee
@harus lihat yang requirments.txtAnda maksud?
Phil
6

Vanilla setuptoolstidak mendukung pengunduhan langsung dari repositori git tetapi Anda dapat menggunakan salah satu tautan Sumber Unduh dari halaman itu, seperti:

easy_install http://github.com/mtai/python-gearman/tarball/master
Ned Deily
sumber
Jadi, untuk memastikan bahwa versi python-gearman ini diinstal pada server mana pun paket saya akan, saya harus menjalankan easy_install secara manual sebelum menginstal paket saya?
andrei
Jika Anda menggunakan easy_install, ya. Tetapi, seperti yang ditunjukkan orang lain, Anda dapat beralih ke pipatau buildoutyang memiliki manajemen persyaratan yang lebih canggih. Lihat, misalnya: pip.openplans.org/#requirements-files
Ned Deily
Sebenarnya, Anda tidak harus menjalankan easy_install secara manual; Anda cukup menambahkan tautan ekstra ke setup.py Anda. Saya akan menulis jawaban yang menjelaskan detailnya.
PJ Eby
2
Seperti yang disebutkan dalam komentar saya di atas, setup.py menyediakan dependency_links yang memungkinkan Anda untuk mengunduh dari repositori
gti