2013-03-29 67 views
21

Tôi muốn phân tích cây phụ thuộc của các gói Python. Làm cách nào để có được dữ liệu này?Cây phụ thuộc gói Python

Những điều tôi đã biết

  1. setup.py đôi khi chứa một lĩnh vực requires liệt kê gói phụ thuộc
  2. PyPi là một kho lưu trữ trực tuyến các gói Python
  3. PyPi có một API

Những điều đó Tôi không biết

  1. Rất ít dự án (khoảng 10%) trên PyPi liệt kê rõ ràng các phụ thuộc trong trường requires nhưng pip/easy_install vẫn quản lý để tải xuống các gói chính xác. Tôi đang thiếu gì? Ví dụ: thư viện phổ biến cho tính toán thống kê, pandas, không liệt kê requires nhưng vẫn quản lý cài đặt numpy, pytz, v.v. Có cách nào tốt hơn để tự động thu thập danh sách đầy đủ các phụ thuộc không?
  2. Có cơ sở dữ liệu có sẵn ở đâu đó không? Tôi đang lặp lại công việc hiện tại?
  3. Làm tương tự, dễ dàng truy cập, cơ sở dữ liệu tồn tại cho các ngôn ngữ khác với các hệ thống phân phối (R, Clojure, vv ...?)
+0

Câu hỏi của bạn, thực tế là quá rộng. Đừng đặt quá nhiều câu hỏi vào một bài đăng, và giữ cho nó thực tế và có thể trả lời được. Điểm của bạn 3. mời các cuộc tranh luận và danh sách mua sắm hơn là các câu trả lời cụ thể. –

Trả lời

18

Bạn nên nhìn vào các lĩnh vực install_requiresthay, xem New and changed setup keywords.

requires được coi là quá mơ hồ một trường để dựa vào cài đặt phụ thuộc. Ngoài ra, có các trường setup_requirestest_requires cho các phụ thuộc bắt buộc cho setup.py và để chạy thử nghiệm.

Chắc chắn, biểu đồ phụ thuộc đã được phân tích trước đó; từ đây blog article by Olivier Girardot có hình ảnh tuyệt vời này:

PyPI dependencies
Hình ảnh được liên kết với phiên bản tương tác của biểu đồ.

+1

thx cho lời khen: p –

+4

Vâng, nó * là * một biểu đồ rất đẹp! –

+1

Đồ thị đó thật đáng kinh ngạc. – Will

2

Sử dụng công cụ như pip, bạn có thể liệt kê tất cả các yêu cầu cho từng gói.

Lệnh là:

pip install --no-install package_name 

Bạn có thể tái sử dụng một phần của pip trong kịch bản của bạn. Phần chịu trách nhiệm phân tích các yêu cầu là mô-đun pip.req.

+2

Tôi thích ý tưởng sử dụng 'pip' từ bên trong Python. Giao diện dòng lệnh thất bại nếu tôi đã cài đặt gói. Làm thế nào tôi có thể sử dụng mã Python trực tiếp để tìm phụ thuộc của một gói cụ thể? – MRocklin

+1

'--no-install' không được chấp nhận. –

0

Đây là cách bạn có thể làm điều đó theo chương trình sử dụng python pip gói:

from pip._vendor import pkg_resources # Ensure pip conf index-url pointed to real PyPi Index 

# Get dependencies from pip 
package_name = 'Django' 
try: 
    package_resources = pkg_resources.working_set.by_key[package_name.lower()] # Throws KeyError if not found 
    dependencies = package_resources._dep_map.keys() + ([str(r) for r in package_resources.requires()]) 
    dependencies = list(set(dependencies)) 
except KeyError: 
    dependencies = [] 

Và đây là cách bạn có thể nhận được phụ thuộc từ API PyPi:

import requests 
import json 
package_name = 'Django' 
# Package info url 
PYPI_API_URL = 'https://pypi.python.org/pypi/{package_name}/json' 
package_details_url = PYPI_API_URL.format(package_name=package_name) 
response = requests.get(package_details_url) 
data = json.loads(response.content) 
if response.status_code == 200: 
    dependencies = data['info'].get('requires_dist') 
    dependencies2 = data['info'].get('requires') 
    dependencies3 = data['info'].get('setup_requires') 
    dependencies4 = data['info'].get('test_requires') 
    dependencies5 = data['info'].get('install_requires') 
    if dependencies2: 
     dependencies.extend(dependencies2) 
    if dependencies3: 
     dependencies.extend(dependencies3) 
    if dependencies4: 
     dependencies.extend(dependencies4) 
    if dependencies5: 
     dependencies.extend(dependencies5) 
    dependencies = list(set(dependencies)) 

Bạn có thể sử dụng đệ quy để gọi phụ thuộc của phụ thuộc để có được cây đầy đủ. Chúc mừng!

Các vấn đề liên quan