2011-02-02 50 views
29

Tôi hoàn toàn mới đối với Python và tôi biết câu hỏi này được hỏi nhiều lần, nhưng tiếc là có vẻ như tình huống của tôi hơi khác ... Tôi đã tạo một gói (hoặc vì vậy tôi nghĩ). Cây danh mục giống như sau:Lỗi Python: AttributeError: đối tượng 'module' không có thuộc tính

mydir 
    lib  (__init__.py) 
    mod1 (__init__.py, mod11.py) 

Trong ngoặc đơn có các tệp trong danh mục. Cả hai tệp __init__.py đều có độ dài bằng 0. File mydir/lib/mod1/mod11.py chứa sau:

def mod12(): 
    print "mod12" 

Bây giờ, tôi chạy python, sau đó import lib, hoạt động OK, sau đó lib.mod11() hoặc lib.mod12(). Một trong hai số cuối cung cấp cho tôi thông báo lỗi chủ đề. Trên thực tế, dir(lib) sau Bước 2 cũng không hiển thị mod11 hoặc mod12. Có vẻ như tôi đang thiếu một cái gì đó thực sự đơn giản. (Tôi đang sử dụng Python 2.6 trong Ubuntu 10.10)

Cảm ơn bạn

+1

Thông báo lỗi trong chủ đề không đầy đủ. Có thể hữu ích khi đăng thông báo lỗi đầy đủ ở đây trong phần nội dung. – Keith

Trả lời

5

Con đường tôi sẽ làm điều đó là để lại những __ file init__.py trống rỗng, và làm:

import lib.mod1.mod11 
lib.mod1.mod11.mod12() 

hoặc

from lib.mod1.mod11 import mod12 
mod12() 

Bạn có thể thấy rằng thư mục mod1 không cần thiết, chỉ cần có mod12.py trong lib.

29

Khi bạn import lib, bạn đang nhập gói. Các tập tin duy nhất để có được đánh giá và chạy trong trường hợp này là 0 byte __init__.py trong thư mục lib.

Nếu bạn muốn truy cập chức năng của mình, bạn có thể làm một cái gì đó như thế này from lib.mod1 import mod1 và sau đó chạy chức năng mod12 như vậy mod1.mod12().

Nếu bạn muốn để có thể truy cập vào mod1 khi bạn nhập lib, bạn cần phải đặt một import mod1 bên trong các tập tin bên trong thư mục __init__.pylib.

22

Chính xác hơn, các thư mục mod1lib của bạn không phải là các mô-đun, chúng là các gói. Tập tin mod11.py là một mô-đun.

Python không tự động nhập các gói con hoặc mô-đun. Bạn phải làm điều đó một cách rõ ràng, hoặc "ăn gian" bằng cách thêm các câu lệnh nhập vào trong bộ khởi tạo.

>>> import lib 
>>> dir(lib) 
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__'] 
>>> import lib.pkg1 
>>> import lib.pkg1.mod11 
>>> lib.pkg1.mod11.mod12() 
mod12 

Một cách khác là sử dụng cú pháp from để "kéo" một module từ một gói vào bạn kịch bản namespace.

>>> from lib.pkg1 import mod11 

Sau đó, tham chiếu hàm chỉ đơn giản là mod11.mod12().

4

Giải pháp của tôi là đưa những hàng nhập khẩu trong __init__.py của lib:

in file: __init__.py 
import mod1 

Sau đó,

import lib 
lib.mod1 

sẽ hoạt động tốt.

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