วิธีค้นหาการอ้างอิงของแพ็คเกจ Python


109

คุณจะรับรายการการอ้างอิงของแพ็คเกจ Python โดยทางโปรแกรมได้อย่างไร

มาตรฐานsetup.pyมีเอกสารเหล่านี้ แต่ฉันไม่พบวิธีง่ายๆในการเข้าถึงจาก Python หรือบรรทัดคำสั่ง

ตามหลักการแล้วฉันกำลังมองหาสิ่งที่ต้องการ:

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

หรือ:

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

หมายเหตุฉันไม่ได้พูดถึงการนำเข้าแพ็คเกจและค้นหาโมดูลที่อ้างอิงทั้งหมด แม้ว่าสิ่งนี้อาจพบแพคเกจที่ขึ้นอยู่กับส่วนใหญ่ แต่ก็ไม่สามารถค้นหาหมายเลขเวอร์ชันขั้นต่ำที่ต้องการได้ ที่เก็บไว้ใน setup.py เท่านั้น


คำตอบค่อนข้างน้อยที่นี่แสดงว่า pip ถูกนำเข้าเพื่อใช้ในโปรแกรม เอกสาร pipขอแนะนำให้ใช้จุดนี้ สิ่งที่ควรทราบในกรณีที่มีการใช้โซลูชันเหล่านี้สำหรับสิ่งที่สำคัญ
Jordan Mackie

คำตอบ:


102

นอกจากpip show [package name]คำสั่งแล้วยังมีpipdeptree.

แค่ทำ

$ pip install pipdeptree

จากนั้นเรียกใช้

$ pipdeptree

และจะแสดงการพึ่งพาของคุณในรูปแบบต้นไม้เช่น

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]

โครงการตั้งอยู่ที่https://github.com/naiquevin/pipdeptreeซึ่งคุณจะพบข้อมูลการใช้งาน


8
pipdeptreeแสดงการอ้างอิงของแพ็คเกจที่ติดตั้งทั้งหมด ไม่ใช่เฉพาะของแพ็คเกจที่กำหนด แม้ว่าคุณจะสามารถกรองเอาต์พุตได้ แต่ก็ยังขึ้นอยู่กับแพ็คเกจที่จะติดตั้งไว้แล้ว --json
sschuberth

จริง แต่คำตอบยังคงมีประโยชน์เมื่อคุณต้องการเก็บไว้ว่าทำไมแพ็คเกจจึงถูกติดตั้งที่ไม่ได้อยู่ในrequirements.txt:)
beruic

3
นอกจากนี้คุณยังสามารถใช้-pตัวเลือกเพื่อเลือกแพ็กเกจเพียงไม่กี่แพ็กเกจที่คุณต้องการสำรวจ
Zaccharie Ramzi

2
pipdeptreerequirements.txtเป็นประโยชน์สุดเมื่อการเพิ่มประสิทธิภาพ $ pipdeptree | grep -P '^\w+' สิ่งนี้ส่งออกเฉพาะแพ็กเกจระดับบนสุด ข้อมูลเพิ่มเติมที่นี่
Lead Developer

67

ลองใช้showคำสั่งในpipตัวอย่างเช่น:

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

อัปเดต (ดึง deps ด้วยเวอร์ชันที่ระบุ):

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']

2
ที่จะบอกคุณรุ่นของแพคเกจไม่ได้ของการอ้างอิง ; พวกเขาเพิ่งได้รับการจดทะเบียน
jonrsharpe

ดูRequiresส่วน
Alex Lisovoy

3
ใช่ แต่จะไม่แสดง"หมายเลขเวอร์ชันขั้นต่ำที่ต้องการ"ตามที่ OP ต้องการ:
jonrsharpe

1
ยังไงก็$ pip3 show beautifulsoup4แสดงว่าว่างRequires: สำหรับฉัน - ไม่สวย
xealits

4
@PythonJin ใช่เห็นได้ชัดว่ามันใช้แพ็คเกจมาตรฐานเท่านั้น .. ฉันรู้สึกประหลาดใจเล็กน้อยกับสิ่งนั้น ทำได้ดีbeautifulsoup4มาก
xealits

6

คำตอบค่อนข้างน้อยที่นี่แสดงว่า pip ถูกนำเข้าเพื่อใช้ในโปรแกรม เอกสาร pip ขอแนะนำให้ใช้จุดนี้

แทนที่จะเข้าถึงpkg_resourcesผ่านการนำเข้า pip คุณสามารถนำเข้าpkg_resourcesโดยตรงและใช้ตรรกะเดียวกันได้ (ซึ่งจริงๆแล้วเป็นหนึ่งในโซลูชันที่แนะนำใน pip docs ที่เชื่อมโยงสำหรับทุกคนที่ต้องการดูข้อมูลเมตาแพ็กเกจโดยทางโปรแกรม)

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()]

หากคุณมีปัญหาในการค้นหาว่าชื่อแพ็กเกจของคุณคืออะไรWorkingSetอินสแตนซ์จะส่งคืนโดยpkg_resources.working_setการใช้งาน__iter__เพื่อให้คุณสามารถพิมพ์ทั้งหมดและหวังว่าจะพบของคุณในนั้น :)

กล่าวคือ

import pkg_resources

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

สิ่งนี้ใช้ได้กับทั้ง python 2 และ 3 (แม้ว่าคุณจะต้องปรับคำสั่งการพิมพ์สำหรับ python2)


4

(นี่เป็นคำตอบแบบดั้งเดิมและควรหลีกเลี่ยงสำหรับรุ่น PIP ที่ทันสมัยและอยู่ทางซ้ายที่นี่สำหรับการอ้างอิงไปยังเวอร์ชันเก่าของ PIP) คำตอบของ Alex นั้นดี (+1) ในหลาม:

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

ควรส่งคืนสิ่งที่ต้องการ

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

โดยที่บิดคือชื่อของแพ็คเกจซึ่งคุณสามารถพบได้ในพจนานุกรม:

pip._vendor.pkg_resources.WorkingSet().entry_keys

เพื่อแสดงรายการทั้งหมด:

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))

ควรให้รายการดังนี้:

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')]

มีอะไรเปลี่ยนแปลงในเวอร์ชันล่าสุดหรือไม่? _vendorแอตทริบิวต์ไม่ได้ดูเหมือนจะมีอยู่ในรุ่น pip 19.1.1(แก้ไข: สิทธิทั้งหมดดูเหมือนว่าจะได้ย้ายไปอยู่ที่pkg_resourcesแพคเกจในรุ่นล่าสุดหลาม!)
Prahlad Yeri

ใช่มีการเปลี่ยนแปลงและฉันจะดูการอัปเดตสิ่งนี้หรือลบออกตามคำแนะนำด้านล่าง
cgseller

คำตอบของอเล็กซ์ดีขึ้นเพียงบางส่วนจากมุมมองของฉัน ( pip showส่วนดีไม่ใช่ส่วนที่เหลือ) ทั้งการใช้งานpip show, pipdeptreeหรือดูคำตอบจอร์แดนแม็กกี้โดยใช้setuptools ' pkg_resourcesโดยตรง
sinoroc

2

ใช้https://libraries.io/ เป็นสถานที่ที่ดีในการสำรวจการอ้างอิงก่อนติดตั้งโดยใช้ pip

เช่น. พิมพ์ google-cloud-storage แล้วค้นหาจากนั้นคุณจะพบหน้าสำหรับไลบรารี ( https://libraries.io/rubygems/google-cloud-storage ) เลือกเวอร์ชันที่คุณต้องการสำรวจการอ้างอิงจาก 'การเผยแพร่' (ค่าเริ่มต้นคือรุ่นล่าสุด) ภายใต้ 'การอ้างอิง' คุณจะพบรายการการอ้างอิงและเวอร์ชันที่รองรับ


1

ลองทำตามบทความนี้ใน 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)

มันจะแสดงเช่น:

['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']
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.