2011-11-04 27 views
7

Tôi đã kiểm tra càng nhiều trang SO càng tốt và đã thử mọi thứ tôi đã tìm thấy, nhưng không có trang nào thành công. Tôi cũng đã kiểm tra trang PEP liên quan đến việc nhập và thử mọi ví dụ, không có ví dụ nào trong số đó hoạt động.Cách nhập mô-đun từ thư mục bên cạnh thư mục hiện tại?

Tôi có một thư mục kiểm tra với các bài kiểm tra đơn vị trong đó và tôi cần nhập mô-đun mà tôi muốn kiểm tra. Các mô-đun nằm trong một thư mục có tên 'src' nằm bên cạnh thư mục src.

Các thư mục/tập tin giống như thế này:

Project/
     src/
      stringbuilder.py 
      __init__.py 
     tests/
      stringbuilder_test.py 
      __init__.py 
     main.py 
     __init__.py 

Tôi đã thử tất cả mọi thứ tôi có thể: thêm __init__.py cho mọi thư mục làm cho nó một module bao gồm cả thư mục chính của dự án.

import src.module_to_test 
from ..src.module_to_test import function_to_test 
from ..src import module_to_test 

Tôi đã kiểm tra tất cả các kết hợp khác tất cả đều không thành công. Tôi bắt đầu nghĩ rằng phải có điều gì đó sai trái với thiết lập hoặc sự hiểu biết của tôi-- Tôi nghĩ điều này được cho là đơn giản.

Nếu tôi đang mắc lỗi rõ ràng, vui lòng cho tôi biết.

from tests import stringbuilder 

Thông báo lỗi:

$ ./stringbuilder_test.py 
Traceback (most recent call last): 
    File "./stringbuilder_test.py", line 14, in <module> 
    from tests import stringbuilder 
ImportError: No module named tests 

Các lỗi tương tự xảy ra cho (nhưng các xét nghiệm = src):

from src import stringbuilder 
+0

"src" hoặc "kiểm tra"? Bạn có thể cung cấp cho chúng tôi thêm chi tiết về phân cấp tệp và thư mục của bạn không? – Nicolas

+0

Đã thêm một chút vào bài đăng để thử hiển thị thứ bậc. –

+0

'từ kiểm tra nhập khẩu stringbuilder' - bạn chỉ cần nhìn vào cấu trúc cây ở trên để xem tại sao không thành công –

Trả lời

3

Nếu tập lệnh được thực thi từ bên trong gói, thì cần phải sử dụng nhiều lệnh khác nhau để nhập khẩu hoạt động bình thường. Có lẽ cách phổ biến nhất trong số này là thao tác sys.path:

import sys, os 

sys.path.insert(0, 
    os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 

from src import stringbuilder 

del sys.path[0] 

Không có cách nào để đạt được điều này bằng cách sử dụng báo cáo nhập bình thường.

Giải pháp chung tốt hơn là chỉ đơn giản tránh chạy các tập lệnh trong các gói hoàn toàn. Thay vào đó, hãy đặt tất cả các tập lệnh bên ngoài gói trong thư mục chứa. Cho rằng thư mục của tập lệnh hiện đang chạy được tự động thêm vào đầu của sys.path, điều này sẽ đảm bảo rằng gói có thể luôn được nhập trực tiếp, bất kể tập lệnh được thực thi từ đâu.

Vì vậy, cấu trúc thư mục có thể trông như thế này: sau đó

project/
    package/
     __init__.py 
     src/
      __init__.py 
      stringbuilder.py 
     tests/
      __init__.py 
      stringbuilder_test.py 
    main.py 
    test.py 

Kịch bản test.py có thể nhập các bài kiểm tra của nó như thế này:

from package.tests import stringbuilder_test 

stringbuilder_test.py có thể nhập src module như thế này:

from package.src import stringbuilder 
-3

Thêm thư mục đó để PATH của bạn.

+2

Ouch! Thật là một ý tưởng đáng sợ. –

+0

Thêm nó vào PYTHONPATH là hơi ít đáng sợ nhưng bỏ lỡ điểm của câu hỏi. Thêm vào PATH sẽ không giúp đỡ chút nào. – geoffspear

0
from folder import my_module 

Nếu có tệp __init__.py trong folder.

+0

Điều này không thành công, nó cho biết không có thư mục có tên module. –

+0

Er, tôi nghĩ rằng bạn đã có nghĩa là để thay thế 'thư mục' với tên của thư mục của bạn! –

+0

Tôi đã thử, cùng một lỗi. :( –

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