2009-04-20 35 views
7

Làm cách nào để kiểm tra xem một nhóm mô-đun đã được cài đặt hay chưa, được đặt tên của các mô-đun. Ví dụ.Kiểm tra các phụ thuộc của mô-đun Python đang được cài đặt

modules = set(["sys", "os", "jinja"]) 

for module in modules: 
    # if test(module exists): 
    # do something 

Trong khi nó có thể viết ra các bài kiểm tra như:

try: 
    import sys 
except ImportError: 
    print "No sys!" 

Đây là một chút rườm rà cho những gì tôi đang làm. Có một cách năng động để làm điều này?

Tôi đã thử eval ("import% s"% module) nhưng đã bị khiếu nại về lỗi biên dịch.

Tôi rất biết ơn những suy nghĩ và đề xuất của bạn. Cảm ơn bạn.

Trả lời

8

Bạn có thể sử dụng chức năng __import__() như thế này ::

for module in modules: 
    try: 
     __import__(module) 
    except ImportError: 
     do_something() 

Bạn cũng có thể sử dụng imp.find_module để xác định xem một mô-đun có thể được tìm thấy mà không nhập khẩu nó ::

import imp 
for module in modules: 
    try: 
     imp.find_module(module) 
    except ImportError: 
     do_something() 

Oh, và lý do bạn không thể sử dụng eval() là bởi vì import là một tuyên bố, không phải là một biểu thức. Bạn có thể sử dụng exec nếu bạn thực sự muốn, mặc dù tôi không muốn giới thiệu nó ::

for module in modules: 
    try: 
     exec 'import ' + module 
    except ImportError: 
     do_something() 
6

Có vấn đề gì với điều này?

modules = set(["sys", "os", "jinja"]) 
for m in modules: 
    try: 
     __import__(m) 
    except ImportError: 
     # do something 

Ở trên sử dụng chức năng __import__. Ngoài ra, nó là nghiêm túc kiểm tra cho dù nó tồn tại hay không - nó không thực sự tiết kiệm nhập khẩu bất cứ nơi nào, nhưng bạn có thể dễ dàng sửa đổi nó để làm điều đó.

2
modules = set(["sys", "os", "jinja"]) 
try: 
    for module in modules: 
    __import__(module) 
    doSomething() 
except ImportError, e: 
    print e 
5

Đó là giá trị tìm hiểu sự cân bằng giữa phương pháp find_module và __import__ cách tiếp cận:

  • __import__('foo') sẽ kích hoạt bất kỳ tác dụng phụ nào của việc tải mô-đun, bất kể bạn có lưu tham chiếu đến mô-đun đã nhập hay không. Đó có thể là OK, hay không.
  • find_module('foo') sẽ không kích hoạt bất kỳ tác dụng phụ nào, vì vậy nó phải luôn an toàn.
  • không phải phương pháp hoạt động tốt nếu các mô-đun được tìm thấy nhưng có những vấn đề khác tại thời gian tải (ví dụ. Lỗi Cú pháp, NameError, ...)
  • Tùy thuộc vào cách bạn xử lý thất bại, chỉ cần gói __import__('foo') trong một thử/trừ sẽ cung cấp cho bạn có kết quả sai lệch nếu tìm thấy foo nhưng thanh nhập foo là không phải là được tìm thấy.
  • find_module() không thể xử lý tên rải rác, vì vậy nếu bạn cần phải kiểm tra xem 'foo.bar.bat.baz' có thể được nhập khẩu, bạn phải sử dụng nhiều cuộc gọi đến find_module và load_module theo docs.
Các vấn đề liên quan