Làm cách nào tôi có thể khiến setuptools cài đặt gói không có trên PyPI?


142

Tôi mới bắt đầu làm việc với setuptools và virtualenv. Gói của tôi yêu cầu người lái python mới nhất chỉ có sẵn từ GitHub. Phiên bản python-gearman trên PyPI là phiên bản cũ. Nguồn Github tương thích với setuptools, tức là có setup.py, v.v. Có cách nào để cài đặt setuptools tải xuống và cài đặt phiên bản mới thay vì tìm kiếm nó trên PyPI và cài đặt phiên bản cũ không?

FYI, python-gearman mới là http://github.com/mtai/python-gearman


1
Có lý do gì bạn đang cố gắng cài đặt gói python trực tiếp từ Git thay vì tải xuống nguồn từ đó và sử dụng python setup.py installtrong thư mục nguồn không?
Andrew

4
Tôi muốn gói của tôi được triển khai trên nhiều máy và tất cả các phụ thuộc của nó được cài đặt tự động.
andrei

2
Bạn có thể sử dụng easy_installhoặc pipcài đặt trực tiếp từ Github. Nhưng cũng có một giải pháp khác, bạn đã cân nhắc việc thêm gói vào PyPI chưa?
Wolph

2
Vì nó chỉ đơn giản là để triển khai, tại sao không sử dụng buildout? Nó có một vài plugin Git làm sẵn.
Wolph

giải pháp tại đây: stackoverflow.com/a/17442663/1841871
zazabe

Câu trả lời:


156

Điều quan trọng là nói với easy_install nơi gói có thể được tải xuống. Trong trường hợp cụ thể này, nó có thể được tìm thấy tại url http://github.com/mtai/python-gearman/tarball/master . Tuy nhiên, liên kết đó tự nó sẽ không hoạt động, bởi vì easy_install không thể biết chỉ bằng cách xem URL nó sẽ nhận được gì.

Thay đổi nó thành http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta , easy_install sẽ có thể xác định tên gói và phiên bản của gói.

Bước cuối cùng là thêm URL vào phụ thuộc_links của gói, ví dụ:

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

Bây giờ, khi gói CỦA BẠN đang được cài đặt, easy_install sẽ phát hiện ra rằng có "gearman 2.0.0beta" có sẵn để tải xuống từ URL đó và vui vẻ chọn gói đó trên PyPI, nếu bạn chỉ định "gearman> = 2.0.0beta" trong sự phụ thuộc của bạn ..

(Thông thường, cách thức thực hiện loại này là đưa liên kết trên trang PyPI của một người vào nguồn có thể tải xuống; trong trường hợp này, nếu tác giả của gói gearman đã bao gồm một liên kết như trên, bạn đã được đặt Thông thường, mọi người đánh dấu phiên bản phát triển bằng 'myproject-dev' và sau đó mọi người sử dụng yêu cầu 'myproject> = somever, == dev', để nếu không có gói nào đó hoặc cao hơn, easy_install sẽ cố gắng kiểm tra hoặc tải về bản phát hành.)

Bạn sẽ cần chỉ định --process-dependency-linkskhi sử dụng pip. Lưu ý rằng việc xử lý liên kết phụ thuộc đã không được chấp nhận và sẽ bị xóa trong phiên bản tương lai.


1
Tôi đã làm những gì bạn đề xuất, nhưng khi tôi chạy "python setup.py phát triển", nó báo "viết phụ thuộc_links vào foo.egg-information / Depency_links.txt", nhưng thực tế không tải xuống và cài đặt gói. Tôi đang sử dụng virtualenv dựa trên setuptools nếu điều đó có ích.
andrei

15
Bạn cũng cần phải có install_Vquires = 'gearman> = 2.0.0beta'; bạn đã bao gồm điều đó?
PJ Eby

3
Nó không hoạt động đối với tôi, với betahậu tố trên phiên bản hiện có trên PyPI, nó vẫn sẽ cài đặt gói từ PyPI thay vì gói được xác định trong dependency_links. Nếu bạn cố gắng đặt phiên bản cao hơn phiên bản tồn tại trên PyPI #egg=package-version, công cụ thiết lập sẽ khiếu nại với Could not find a version that satisfies the requirementlỗi và danh sách tất cả các phiên bản có sẵn trên PyPI. Lưu ý rằng tôi đang cố gắng xây dựng gói của mình với sdist, sau đó cài đặt gói đó pip install http://url/to/my/generated/tar.
zazabe

1
ok, bằng cách cài đặt gói của tôi với easy_install http://url/to/my/generated/tar, mọi thứ hoạt động như mong đợi ... Có ai biết tại sao không?
zazabe

3
--process-dependency-linksđã được gỡ bỏ kể từ pipngày 19! Xem: github.com/pypa/pip/issues/6162
phượng hoàng

67

Bạn có thể sử dụng pip install protocol+location[@tag][#egg=Dependency]định dạng để cài đặt trực tiếp từ nguồn bằng 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

Không kiên định

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

Các giao thức sau được hỗ trợ: [+git, +svn, +hg, +bzr]

Phiên bản

@tag cho phép bạn chỉ định một phiên bản / thẻ cụ thể để kiểm tra.

#egg=name cho phép bạn chỉ định những gì dự án là một phụ thuộc cho người khác.

Thứ tự phải luôn luôn @tag#egg=name.

Kho riêng

Bạn cũng có thể cài đặt từ kho riêng bằng cách thay đổi giao thức thành SSH ( ssh://) và thêm người dùng thích hợp ( git@):

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

Bạn cũng có thể cài đặt từ kho riêng với tên người dùng / mật khẩu.

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

Github cung cấp khả năng tạo mã thông báo OAuth cá nhân có thể được chuyển đổi

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

Yêu cầu.txt

requirements.txt được sử dụng để xác định các phụ thuộc của dự án:

Yêu cầu.txt

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

Chúng không được cài đặt tự động với gói và phải được cài đặt bằng lệnh pip -r requirements.txt.

Bao gồm các tệp yêu cầu

Tệp yêu cầu có thể bao gồm các tệp yêu cầu khác:

yêu cầu-docs.txt

sphinx
-r requirements-dev.txt

yêu cầu-dev.txt

some-dev-tool
-r requirements.txt

Yêu cầu.txt

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

thiết lập

Các tệp yêu cầu có thể cài đặt các phụ thuộc được chỉ định trong setup.pylệnh sau:

-e .

setup.pycũng có thể cài đặt từ các kho lưu trữ bằng cách sử dụng cú pháp tương tự như trên, nhưng sử dụng dependency_linksgiá trị như được đề cập trong câu trả lời này .

Người giới thiệu:

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


2
setup.py CÓ THỂ cài đặt từ kho lưu trữ. Chỉ cần tìm kiếm 'setup.py phụ
thuộc_links

1
@TomDotTom Derp, tôi thậm chí đã nêu lên câu trả lời đó nhưng bằng cách nào đó đã không đồng hóa nó = P Tôi sẽ cập nhật câu trả lời của mình. Cảm ơn đã chỉ ra rằng! Nó sẽ giúp với một số điều tôi đang làm.
Hoàn trả

Depencies_links Tôi nghĩ rằng đang bị khấu hao mặc dù (?) github.com/pypa/pip/issues/3939 . Tôi thích câu trả lời này và nghĩ rằng nó tốt hơn do có thể (trong setup.py):extras_require={'all': [repo @ git+https://github.com/username/repo.git]}
Josiah L.

21

Vì tôi chỉ phải làm điều tương tự, tôi đã tìm ra một cách khác để làm điều này vì pip--process-dependency-linksđược lên kế hoạch xóa vào năm pip19.0 theo nhận xét này .

pip 18.1 bao gồm các tính năng sau

Cho phép các yêu cầu URL PEP 508 được sử dụng làm phụ thuộc.

Từ mô tả của PEP 508, cú pháp cho các phụ thuộc URL đó trông giống như:

Tra cứu dựa trên URL tối thiểu:

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

Vì vậy, trong bạn setup.pynó sẽ trông giống như

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

Lưu ý, liên kết là một tệp lưu trữ và cũng có thể là một bản phát hành hoặc nhánh cụ thể của kho lưu trữ như được mô tả trong câu trả lời này . Ngoài ra, hãy xem câu trả lời đó để làm việc với các máy chủ lưu trữ khác.

Theo hiểu biết tốt nhất của tôi, cách dễ nhất để cập nhật sự phụ thuộc là sử dụng pip install -I .khi cài đặt gói của bạn từ thư mục của nó.


Điều này cũng hỗ trợ mọi thứ pip installhỗ trợ, chẳng hạn như URL git, #subdirectory=...v.v.? Hay họ đã đưa ra một cú pháp hoàn toàn mới với các tính năng khác nhau được thể hiện theo một cách khác và không tương thích?
lại

Nếu bạn không sử dụng setuptools và quản lý các phụ thuộc theo cách thủ công trên dòng lệnh thì có vẻ như bạn vẫn phải sử dụng cách tiếp cận được mô tả bởi câu trả lời của @Rebs .
Phil

1
Chỉ cần xác nhận điều này hoạt động với distutils.core.setuppip 19.1.1
nên xem

requirements.txtTuy nhiên, kết quả không tương thích vớipip install -r requirments.txt
nên xem

@shouldsee mà requirments.txtbạn đang đề cập đến?
Phil

6

Vanilla setuptoolskhông hỗ trợ tải xuống trực tiếp từ kho git nhưng bạn có thể sử dụng một trong các liên kết Tải xuống nguồn từ trang đó, như:

easy_install http://github.com/mtai/python-gearman/tarball/master

Vì vậy, để đảm bảo rằng phiên bản python-gearman này được cài đặt trên bất kỳ máy chủ nào có gói của tôi, tôi sẽ phải chạy easy_install bằng tay trước khi cài đặt gói của mình?
andrei

Nếu bạn sử dụng easy_install, có. Nhưng, như những người khác đã chỉ ra, bạn có thể chuyển sang piphoặc buildoutcó quản lý yêu cầu phức tạp hơn. Xem, ví dụ: pip.openplans.org/#requirements-files
Ned Deily

Trên thực tế, bạn không phải chạy thủ công easy_install; bạn chỉ có thể thêm liên kết bổ sung vào setup.py của bạn. Tôi sẽ viết một câu trả lời giải thích chi tiết.
PJ Eby

2
Như đã đề cập trong nhận xét của tôi ở trên setup.py cung cấp sự phụ
thuộc_links
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.