2010-05-20 31 views
21

Nói rằng gói python A yêu cầu B, C và D; có cách nào để liệt kê A → B C D mà không cần tải chúng?
Requires trong siêu dữ liệu (yolk -M A) thường không đầy đủ, grr.
Người ta có thể tải xuống A.tar/A.egg, sau đó xem qua A/setup.py, nhưng một số trong số đó là khá đẫm máu.liệt kê các gói phụ thuộc python mà không cần tải chúng?

(Tôi muốn có thể nghĩ rằng việc phụ thuộc ít nhất đầu tiên cấp có thể là cơ giới hóa; thậm chí là một giải pháp 98% sẽ là tốt hơn so với avalanching tải.)

Một câu hỏi liên quan: pip-upgrade-package-without-upgrading-dependencies

Trả lời

28

Snakefood

sfood -fuq package.py | sfood-target-files 

sẽ liệt kê các phụ thuộc.

`-f` tells sfood to follow dependencies recursively 
`-u` tells sfood to ignore unused imports 
`-q` tells sfood to be quiet about debugging information 

Để lọc ra các module từ thư viện tiêu chuẩn, bạn có thể sử dụng

sfood -fuq package.py | sfood-filter-stdlib | sfood-target-files 

Như bạn đã lưu ý, nếu có thư mục khác mà bạn muốn bỏ qua, bạn cũng có thể sử dụng sfood -I cờ.

+0

có vẻ hợp lý, +1. sfoodxx -I /Library/...python2.6 (mac) không lọc ra sys nhập khẩu tiêu chuẩn, os.path vv? – denis

+0

@Denis: Sử dụng 'sfood-filter-stdlib' để xóa các mục khỏi thư viện chuẩn Python. Tôi sẽ chỉnh sửa câu trả lời của tôi để bao gồm ... – unutbu

+1

sfood-filter-stdlib có '/ usr/lib/python' được lưu trữ trong, và không hoạt động đối với nhập khẩu thực phẩm. Đang yêu cầu tác giả ... Bytheway Kevin Teague, "Tôi muốn một con ngựa" http://groups.google.com/group/django-developers/msg/5407cdb400157259 là tổng quan nổi bật về các phương pháp đóng gói trong năm 2008.) – denis

12

modulefinder từ lib chuẩn

mới trong phiên bản 2.3.

Mô-đun này cung cấp lớp học ModuleFinder có thể được sử dụng để xác định bộ mô-đun được nhập bởi tập lệnh . modulefinder.py cũng có thể là chạy dưới dạng tập lệnh, đặt tên tệp của tập lệnh Python làm đối số của nó, sau đó báo cáo mô-đun được nhập sẽ được in.

Tôi không chắc liệu nó có phù hợp với yêu cầu của bạn về việc không tải các mô-đun hay không. From here:

modulefinder sử dụng bytecode kiểm tra để tìm phụ thuộc, và do đó là miễn phí từ bất kỳ tác dụng phụ mà có thể gây ra bằng cách nhập các module là nghiên cứu.

gợi ý khác về việc sử dụng pylint hoặc Gui2exe here

+2

modulefinder không hoạt động nhưng nó sẽ hiển thị rất nhiều công cụ vô ích và phụ thuộc gián tiếp (phụ thuộc CÓ THỂ được sử dụng bởi các phụ thuộc của bạn, nhưng thực sự thì không). Bạn có thể tìm thấy một kịch bản mẫu mà tôi đã sử dụng modulefinder tại đây: https://gist.github.com/lrq3000/6175634 Và một kịch bản thay thế bằng cách sử dụng phương pháp phân tích cú pháp AST ở đây (và cách nào hoạt động tốt hơn cho tôi): https: // gist .github.com/lrq3000/6175522 – gaborous

5

Nếu bởi gói bạn có nghĩa là một pip cài đặt gói (và không phải là một thư mục với một __init__.py), sau đó bạn có thể sử dụng gói Python gọi là pip . Ví dụ:

def get_all_package_dependencies(): 
    """Return dictionary of installed packages to list of package dependencies.""" 
    return { 
     dist.key: [r.key for r in dist.requires()] 
     for dist in pip.get_installed_distributions() 
    } 
+0

Tôi thấy một gói trên web và muốn biết các chi tiết của nó. Có 'pip install --no-deps', sau đó đào xung quanh ... hoặc có lệnh pip mới hơn vào danh sách-deps? (Yêu cầu các tệp thường xuyên nhất không có ở đó.) – denis

+0

và pprint có thể được sử dụng để in đẹp đầu ra do đoạn mã trên tạo ra – binithb

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