2013-02-02 34 views
27

Tôi có một mô-đun tên extended.py chứa các dòng sau:'nhập khẩu tương đối Cố gắng trong phi gói' mặc dù gói với __init__.py trong một thư mục

from .basic import BasicModule 

và file basic.py nằm trong cùng thư mục với không __init__.py. Tuy nhiên, khi tôi cố gắng chạy nó như:

python extended.py 

tôi nhận được lỗi:

ValueError: Attempted relative import in non-package 

Cũng thêm dòng:

from __future__ import absolute_import 

không giải quyết được vấn đề. Có lẽ tôi quá mệt mỏi để thấy rõ ràng - nhưng tôi không thấy vấn đề ở đây.

+1

có thể trùng lặp của [Đã cố gắng nhập tương đối không gói ngay cả với \ _ \ _ init \ _ \ _ py] (http://stackoverflow.com/questions/11536764/attempted-relative-import-in-non- package-even-with-init-py) – BrenBarn

+0

làm thế nào về 'python -m parent_directory.extended'? – SparkAndShine

+0

Có thể trùng lặp của [Làm thế nào để nhập khẩu tương đối trong Python?] (Http://stackoverflow.com/questions/72852/how-to-do-relative-imports-in-python) –

Trả lời

47

Nhập khẩu tương đối chỉ hoạt động đối với các gói, nhưng khi bạn nhập vào extended.py bạn đang chạy mô-đun cấp cao nhất thay thế.

Thư mục hiện tại có thể chứa tệp __init__.py nhưng chưa làm cho exended.py một phần của gói.

Để một thứ được coi là một gói, bạn cần phải nhập tên thư mục thay thế. Sau đây sẽ làm việc:

main.py 

packagename\ 
    __init__.py 
    basic.py 
    extended.py 

sau đó trong main.py đặt:

import packagename.extended 

và chỉ sau đóextended một phần của gói và làm hàng nhập khẩu liên quan làm việc.

Nhập tương đối hiện có thứ gì đó tương đối tới, phụ huynh packagename.

+3

Nhưng làm thế nào tôi có thể chạy ' unittests' trong trường hợp đó? Tôi có phải chỉ định một đối số python (-m) cho các trường hợp nhập này không? – Alex

+0

Đối với mọi thứ không được định nghĩa trong một gói, không sử dụng nhập khẩu tương đối, thay vào đó hãy sử dụng nhập khẩu tuyệt đối. Một kịch bản không liên quan không phải là một phần của gói, nó là một kịch bản bên ngoài. –

+0

Tôi luôn nghĩ rằng một trong những nên bỏ unittests bên trong cùng một mô-đun? Có một thực hành tốt hay một PEP trên đơn vị với python? – Alex