2012-02-14 32 views
16

đa cấp nhập khẩu tương đốiđa cấp nhập khẩu tương đối

Tôi đã theo cấu trúc thư mục

top\ 
    __init__.py 
    util\ 
     __init__.py 
     utiltest.py 
    foo\ 
     __init__.py 
     foo.py 
     bar\ 
     __init__.py 
     foobar.py 

tôi muốn truy cập từ foobar.py module utiltest.py. Tôi đã cố gắng sau nhập khẩu tương đối, nhưng điều này không làm việc: from ...util.utiltest import *

Tôi luôn luôn có được ValueError: Attempted relative import beyond toplevel package

Làm thế nào để làm một khẩu tương đối multileve như vậy?

+1

lý do nhập tương đối? một nhập khẩu tuyệt đối nên là cách dễ nhất để làm điều này;): 'từ util.utiltest import *' –

Trả lời

12

Bạn phải nhập foobar từ thư mục mẹ của top:

import top.foo.bar.foobar 

này cho Python top là gói cấp cao nhất. Nhập khẩu tương đối chỉ có thể bên trong một gói.

11

Tôi nhận thấy đây là một câu hỏi cũ, nhưng tôi cảm thấy câu trả lời được chấp nhận có khả năng bỏ sót vấn đề chính với mã của người hỏi. Nó không sai, nói đúng, nhưng nó đưa ra một gợi ý chỉ tình cờ xảy ra xung quanh vấn đề thực sự.

Vấn đề thực sự là tệp foobar.py trong top\foo\bar đang được chạy dưới dạng tập lệnh. Khi một lần nhập tương đối (đúng) được cố gắng, nó thất bại vì trình thông dịch Python không hiểu cấu trúc gói.

Sửa chữa tốt nhất cho việc này là chạy foobar.py không theo tên tệp, mà thay vào đó sử dụng cờ -m cho người phiên dịch để yêu cầu nó chạy mô-đun top.foo.bar.foobar. Bằng cách này, Python sẽ biết mô-đun chính mà nó đang tải trong một gói, và nó sẽ biết chính xác nơi mà việc nhập khẩu tương đối đang đề cập đến.

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