Cách tìm các gói phụ thuộc của Python


103

Làm cách nào bạn có thể lập trình lấy danh sách các phần phụ thuộc của gói Python?

Tiêu chuẩn setup.pycó những tài liệu này, nhưng tôi không thể tìm thấy cách dễ dàng để truy cập nó từ Python hoặc dòng lệnh.

Tốt nhất, tôi đang tìm kiếm một cái gì đó như:

$ pip install somepackage --only-list-deps
kombu>=3.0.8
billiard>=3.3.0.13
boto>=2.26

hoặc là:

>>> import package_deps
>>> package = package_deps.find('somepackage')
>>> print package.dependencies
['kombu>=3.0.8', 'billiard>=3.3.0.13', 'boto>=2.26']

Lưu ý, tôi không nói về việc nhập một gói và tìm tất cả các mô-đun được tham chiếu. Mặc dù điều này có thể tìm thấy hầu hết các gói phụ thuộc, nhưng nó sẽ không thể tìm thấy số phiên bản tối thiểu được yêu cầu. Nó chỉ được lưu trữ trong setup.py.


Khá nhiều câu trả lời ở đây cho thấy pip được nhập để sử dụng trong các chương trình. Các tài liệu cho pip khuyên mạnh mẽ chống lại việc sử dụng này pip. Một số điều cần lưu ý trong trường hợp bất kỳ giải pháp nào trong số này đang được sử dụng cho bất kỳ điều gì quan trọng.
Jordan Mackie

Câu trả lời:


97

Ngoài pip show [package name]lệnh, có pipdeptree.

Cứ làm đi

$ pip install pipdeptree

sau đó chạy

$ pipdeptree

và nó sẽ hiển thị cho bạn các phụ thuộc của bạn ở dạng cây, ví dụ:

flake8==2.5.0
  - mccabe [required: >=0.2.1,<0.4, installed: 0.3.1]
  - pep8 [required: !=1.6.0,>=1.5.7,!=1.6.1,!=1.6.2, installed: 1.5.7]
  - pyflakes [required: >=0.8.1,<1.1, installed: 1.0.0]
ipdb==0.8
  - ipython [required: >=0.10, installed: 1.1.0]

Dự án được đặt tại https://github.com/naiquevin/pipdeptree , nơi bạn cũng sẽ tìm thấy thông tin sử dụng.


7
pipdeptreehiển thị các phụ thuộc của tất cả các gói đã cài đặt , không chỉ của một gói nhất định. Trong khi bạn có thể lọc --jsonđầu ra của nó , nó vẫn phụ thuộc vào các gói đã được cài đặt.
sschuberth

Đúng vậy, nhưng câu trả lời vẫn còn hữu ích khi bạn muốn có được một tổ chức của lý do tại sao các gói đã được cài đặt mà không phải là ở bạn requirements.txt:)
beruic

3
Ngoài ra, bạn có thể sử dụng -ptùy chọn để chỉ chọn một vài gói có các gói phụ thuộc mà bạn muốn khám phá.
Zaccharie Ramzi

2
pipdeptreerất hữu ích khi tối ưu hóa requirements.txt. $ pipdeptree | grep -P '^\w+' Điều này chỉ xuất ra các gói cấp cao nhất. Thông tin thêm tại đây
Nhà phát triển chính

63

Hãy thử sử dụng showlệnh trong pip, ví dụ:

$ pip show tornado
---
Name: tornado
Version: 4.1
Location: *****
Requires: certifi, backports.ssl-match-hostname

Cập nhật (truy xuất điểm với phiên bản được chỉ định):

from pip._vendor import pkg_resources


_package_name = 'somepackage'
_package = pkg_resources.working_set.by_key[_package_name]

print([str(r) for r in _package.requires()])  # retrieve deps from setup.py

Output: ['kombu>=3.0.8', 
         'billiard>=3.3.0.13', 
         'boto>=2.26']

1
Điều đó cho bạn biết phiên bản của gói , không phải các phụ thuộc của nó ; họ chỉ được liệt kê.
jonrsharpe

Xem Requiresphần
Alex Lisovoy

3
Có, nhưng nó không hiển thị "số phiên bản tối thiểu cần thiết" , như OP yêu cầu:
jonrsharpe

1
Bằng cách nào đó các $ pip3 show beautifulsoup4chương trình trống Requires: đối với tôi - không phải beautifulsoup4 phụ thuộc vào bất cứ điều gì?
xealits

4
@PythonJin, vâng, rõ ràng nó chỉ sử dụng các gói tiêu chuẩn .. Tôi chỉ hơi ngạc nhiên với điều đó. Làm tốt lắm beautifulsoup4,.
xealits

6

Khá nhiều câu trả lời ở đây cho thấy pip được nhập để sử dụng trong các chương trình. Các tài liệu cho pip khuyên mạnh mẽ chống lại việc sử dụng này pip .

Thay vì truy cập pkg_resourcesthông qua nhập pip, bạn thực sự có thể chỉ nhập pkg_resourcestrực tiếp và sử dụng cùng một logic (thực sự là một trong những giải pháp được đề xuất trong tài liệu pip được liên kết cho bất kỳ ai muốn xem thông tin meta gói theo chương trình).

import pkg_resources

_package_name = 'yourpackagename'

def get_dependencies_with_semver_string():
    package = pkg_resources.working_set.by_key[_package_name]
    return [str(r) for r in package.requires()]

Nếu bạn gặp một số khó khăn trong việc tìm ra chính xác tên gói của bạn là gì, WorkingSetphiên bản được trả về bởi các pkg_resources.working_settriển khai __iter__để bạn có thể in tất cả chúng và hy vọng tìm thấy gói của bạn trong đó :)

I E

import pkg_resources

def print_all_in_working_set():
    ws = pkg_resources.working_set
    for package_name in ws:
        print(ws)

Điều này hoạt động với cả python 2 và 3 (mặc dù bạn sẽ cần điều chỉnh các câu lệnh in cho python2)


3

(ĐÂY LÀ CÂU TRẢ LỜI HỢP PHÁP VÀ NÊN TRÁNH CÁC PHIÊN BẢN PIP HIỆN ĐẠI VÀ TRÁI Ở ĐÂY ĐỂ THAM KHẢO CÁC PHIÊN BẢN PIP CŨ) Câu trả lời của Alex là tốt (+1). Trong python:

pip._vendor.pkg_resources.working_set.by_key['twisted'].requires()

nên trả lại một cái gì đó như

[Requirement.parse('zope.interface>=3.6.0')]

trong đó xoắn là tên của gói mà bạn có thể tìm thấy trong từ điển:

pip._vendor.pkg_resources.WorkingSet().entry_keys

để liệt kê tất cả:

dict = pip._vendor.pkg_resources.WorkingSet().entry_keys
for key in dict:
    for name in dict[key]:
        req =pip._vendor.pkg_resources.working_set.by_key[name].requires()
        print('pkg {} from {} requires {}'.format(name,
                                                  key,
                                                  req))

sẽ cung cấp cho bạn danh sách như thế này:

pkg pyobjc-framework-syncservices from /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC requires [Requirement.parse('pyobjc-core>=2.5.1'), Requirement.parse('pyobjc-framework-Cocoa>=2.5.1'), Requirement.parse('pyobjc-framework-CoreData>=2.5.1')]

Có gì đó thay đổi trong các phiên bản gần đây không? Các _vendorthuộc tính dường như không tồn tại trong phiên bản pip 19.1.1(Edit: Được rồi, nó dường như đã chuyển sang pkg_resourcesgói trong phiên bản python mới nhất!)
Prahlad Yeri

Vâng, mọi thứ đã thay đổi và tôi sẽ xem xét cập nhật hoặc xóa nó theo đề xuất bên dưới.
cgseller

Câu trả lời của Alex chỉ tốt hơn một phần theo quan điểm của tôi ( pip showmột phần là tốt, không phải phần còn lại). Sử dụng pip show, pipdeptree hoặc xem trực tiếp câu trả lời của Jordan Mackie bằng cách sử dụng setuptools ' pkg_resources.
sinoroc

2

Sử dụng https://libraries.io/ . Đó là một nơi tốt để khám phá các phụ thuộc trước khi cài đặt bằng pip.

Ví dụ. Nhập google-cloud-storage và tìm kiếm, sau đó bạn có thể tìm thấy trang cho thư viện ( https://libraries.io/rubygems/google-cloud-storage ). Chọn phiên bản mà bạn muốn khám phá các phụ thuộc từ 'Bản phát hành' (mặc định là phiên bản mới nhất), Trong 'Phụ thuộc', bạn có thể tìm thấy danh sách phụ thuộc và các phiên bản được hỗ trợ của chúng.


1

Hãy thử điều này theo bài viết này trong python:

import pip 
installed_packages = pip.get_installed_distributions()
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
     for i in installed_packages]) 
print(installed_packages_list)

Nó sẽ hiển thị như sau:

['behave==1.2.4', 'enum34==1.0', 'flask==0.10.1', 'itsdangerous==0.24', 
 'jinja2==2.7.2', 'jsonschema==2.3.0', 'markupsafe==0.23', 'nose==1.3.3', 
 'parse-type==0.3.4', 'parse==1.6.4', 'prettytable==0.7.2', 'requests==2.3.0',
 'six==1.6.1', 'vioozer-metadata==0.1', 'vioozer-users-server==0.1', 
 'werkzeug==0.9.4']
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.