2012-05-20 17 views
28

Tôi đang cố sử dụng importlib.import_module trong trăn 2.7.2 và chạy vào lỗi lạ.Cách nhập mô-đun bằng Python với importlib.import_module

xem xét cấu trúc thư mục sau:

 
    a 
    | 
    + - __init__.py 
     - b 
     | 
     + - __init__.py 
      - c.py 

a/b/__init__.py có đoạn mã sau: (. Trong mã thực "c" có một cái tên)

 
    import importlib 

    mod = importlib.import_module("c") 

Đang cố gắng để nhập a.b mang lại sự lỗi sau:

 
    >>> import a.b 
    Traceback (most recent call last): 
     File "", line 1, in 
     File "a/b/__init__.py", line 3, in 
     mod = importlib.import_module("c") 
     File "/opt/Python-2.7.2/lib/python2.7/importlib/__init__.py", line 37, in import_module 
     __import__(name) 
    ImportError: No module named c 

Tôi đang thiếu gì?

Cảm ơn.

Trả lời

44

Đối với hàng nhập khẩu tương đối bạn phải a) sử dụng tên tương đối b) cung cấp neo một cách rõ ràng:

importlib.import_module('.c', 'a.b') 

Tất nhiên, bạn cũng có thể chỉ làm nhập khẩu tuyệt đối thay vì:

importlib.import_module('a.b.c') 
11

Tôi nghĩ đó là tốt hơn để sử dụng importlib.import_module('.c', __name__) vì bạn không cần biết về ab.

Tôi cũng tự hỏi rằng, nếu bạn phải sử dụng importlib.import_module('a.b.c'), tại sao không chỉ sử dụng import a.b.c?

+4

Nó rất hữu ích khi tên module là một biến. –

1

Và đừng quên để tạo ra một __init__.py với mỗi thư mục/thư mục con (ngay cả khi họ đang có sản phẩm nào)

+0

Cảm ơn! Điều này đã giải quyết được vấn đề của tôi! – user

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