2011-11-16 25 views
5

tôi có một dự án mà trông như thế này:Python nhập khẩu tuyệt đối trong mô-đun không

my_project/ 
      __init__.py -- empty 
      run.py 
      datacheck/ 
        __init__.py -- empty 
        datacheck.py -- containing class DataCheck(object) 
        config.py -- containing BusinessConfig(object) 
        business.py -- containing class BusinessCheck(DataCheck) 

My PYTHONPATH được cấu hình để có/my_project trong đó.

Trong run.py, tôi có đoạn mã sau:

from datacheck.business import BusinessCheck 
business = BusinessCheck() 
business.check_data() 

Trong business.py, tôi có nhập khẩu sau đó thất bại:

from datacheck.config import BusinessConfig 
from datacheck.datacheck import DataCheck 

Một nhập khẩu tương đối như from .config import BusinessConfig công trình - tuy nhiên Tôi đã đọc trong nhiều chủ đề rằng một nhập khẩu tuyệt đối được ưa thích.

Để làm một bài kiểm tra đơn giản, tôi cũng đã tạo ra những điều sau đây:

myproject/ 
      __init__.py -- empty 
      run_test.py 
      test/ 
       __init__.py -- empty 
       test1.py -- containing class Test1(object) 
       test2.py -- containing class Test2(Test1) 

run_test.py nhập khẩu và chạy lớp Test2, điều này đã không thất bại.

Nó khiến tôi hơi hoang mang một chút, tôi không hiểu tại sao nhập khẩu tuyệt đối của tôi trong datacheck không hoạt động - bất cứ ai có thể giải thích?

+0

'từ datacheck.business import Business' nhưng' business.py - chứa class BusinessCheck (DataCheck) '... Trường hợp là lớp' Business' ở đâu? – eumiro

+0

Bạn có tệp '__init __. Py' trong' datacheck' không? Tập tin này làm cho thư mục trở thành một gói và có thể trống. –

+0

@eumiro: Xin lỗi, ít sai lầm - sửa nó. –

Trả lời

6

Bạn nên ưu tiên nhập khẩu tuyệt đối nếu mô-đun của bạn có thể được sử dụng làm __main__, như được giải thích trong documentation. Nếu không, nhập khẩu tương đối là tốt.

Các mục nhập này không thành công, vì gói của bạn datacheck chứa một mô-đun datacheck (cùng tên). Khi tra cứu tên, Python ngầm nhìn vào bên trong gói đầu tiên. Ở đó, nó tìm thấy mô-đun datacheck. Mô-đun này, tuy nhiên, không chứa bất cứ điều gì với tên config, vì vậy việc nhập không thành công.

Nếu bạn muốn sử dụng nhập khẩu tuyệt đối, hãy di chuyển tất cả nội dung từ mô-đun datacheck vào gói __init__.py của gói hoặc đổi tên nó.

+0

Điều đó (datacheck trong datacheck) là tất cả cùng, tôi không bao giờ biết điều này là không thể! Cảm ơn một bó :-) –

+0

@ SjaakTrekhaak: Có thể, nhưng nó tạo ra một sự mơ hồ, vì vậy bạn phải cẩn thận hơn. –

2

Tôi biết đây là nhiều năm sau đó, nhưng vì lợi ích của những người khác tìm kiếm ở đây, tôi đã có thể để giải quyết một vấn đề tương tự với bit mã này:

from __future__ import absolute_import 

Sau đó, nhập khẩu tuyệt đối làm việc tốt trong Python 2.6 và 2.7.

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