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


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

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.


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


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.


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.