2012-02-24 39 views
11

Tôi biết rằng có rất nhiều câu hỏi tương tự về tràn ngăn xếp. Nhưng câu trả lời chung dường như không hiệu quả đối với tôi.đường dẫn tương đối không hoạt động ngay cả với __init__.py

Tôi có một cấu trúc tập tin như thế này

proj/ 
     lib/ 
      __init__.py 
      aa.py 
      bb.py 
      test/ 
       __init__.py 
       aa_test.py 

I figured rằng nếu tôi bao gồm các mã trong test.py tôi

import lib.aa 

hoặc

from lib import aa 

tôi sẽ có thể để tham khảo các mô-đun trong thư mục lib/. Nhưng điều đó không hiệu quả.

Vì vậy, tôi đã cố gắng để thêm vào con đường, và nó thêm nó một cách chính xác:

os.environ["PATH"] += ":%s" % os.path.abspath(os.path.join("..","")) 
print os.environ["PATH"] 

nhưng ngay cả bây giờ khi tôi cố gắng những điều khoản về nhập khẩu trên ... Tôi vẫn gặp lỗi

ImportError: No module named aa 

hoặc

ImportError: Importing from non-package <Something...> 

Có điều gì hiển nhiên tôi đang thiếu không?

Có cách nào để kiểm tra xem tôi đã định cấu hình chính xác các tệp __init__.py của mình hay để xem phân cấp gói của mình không?

Trả lời

13

Bạn cần cập nhật sys.path, là nơi python tìm kiếm mô-đun, trái ngược với đường dẫn của hệ thống trong môi trường hiện tại, đó là những gì os.environ["PATH"] đề cập đến.

Ví dụ:

import os, sys 
sys.path.insert(0, os.path.abspath("..")) 
import aa 

Sau khi làm điều này, bạn có thể sử dụng chức năng của bạn trong aa như thế này: aa.myfunc()

Có một số thông tin trong accepted answer cho biến PATH python: import a module from a directory

2

Thư mục lib cần nằm trong đường dẫn tìm kiếm mô-đun python của bạn, không giống với đường dẫn tìm kiếm được sử dụng bởi trình bao của bạn.

Điều này có lẽ sẽ làm việc cho bạn:

import sys, os 
sys.path.append(os.path.abspath("..")) 

Tuy nhiên, nó có lẽ là tốt hơn để chạy mã của bạn từ một bối cảnh nơi gói lib là đã có trên con đường. Chẳng hạn như từ thư mục 'proj'.

1

Mã mà bạn đang cố gắng nhập lib.aa từ đâu? Tôi đoán/proj/không phải là thư mục làm việc của bạn và nó sẽ cần phải được như nó được thiết lập ngay bây giờ. Thay vì PATH, bạn sẽ muốn thêm thư mục của bạn vào PYTHONPATH để nó xuất hiện trong đường dẫn tìm kiếm để nhập. Xem http://docs.python.org/tutorial/modules.html#the-module-search-path

Ngoài ra, hãy xem http://as.ynchrono.us/2007/12/filesystem-structure-of-python-project_21.html Bạn nên đặt thêm một thư mục ở vị trí thay vì lib.aa, bạn sẽ gọi nó là my_proj.lib.aa.

0

hệ thống không phải là được sử dụng bởi câu lệnh nhập python. Nó sử dụng PYTHONPATH, nhưng cách tốt nhất để thêm thư mục mới để nhập đường dẫn tìm kiếm là sửa đổi sys.path.

Nếu điều này không giúp được, hãy thêm vào câu hỏi giá trị của bạn về sys.path và giá trị được trả về bởi os.getcwd().

0

Tôi gặp sự cố tương tự và đây là lời khuyên của tôi.

Thay vì thay đổi sys.path, hãy chạy test.py của bạn tốt hơn trong thư mục proj (ví dụ: dự án gốc). Đường dẫn dự án theo cách này sẽ tự động ở trong sys.path và bạn sẽ có thể nhập gói lib.

Và sử dụng nhập tuyệt đối.

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