2012-02-24 95 views
11

我知道堆棧溢出中存在大量類似的問題。但常見的答案似乎並沒有爲我工作。即使使用__init__.py,相對路徑也不起作用

我有這樣

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

我想,如果我包括我的test.py代碼

import lib.aa 

from lib import aa 

我就可以一個文件結構以引用lib/目錄中的模塊。但那並不奏效。

所以我試圖添加到路徑,它正確地將其添加:

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

,但即使是現在,當我嘗試上面... import語句我不斷收到錯誤

ImportError: No module named aa 

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

有什麼明顯的我失蹤了嗎?

有沒有辦法檢查我是否正確配置了我的__init__.py文件,或者查看我的包層次結構?

回答

2

lib目錄需要位於您的python模塊搜索路徑中,與您的shell使用的搜索路徑不同。

這可能會爲你工作:

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

但是,它可能是更好地從上下文那裏的lib包已經在路徑上運行代碼。如從'proj'目錄。

1

您試圖從lib.aa導入的代碼在哪裏?我猜/ proj /不是你的工作目錄,它需要是現在安裝的。您可能希望將目錄添加到PYTHONPATH中,以便它顯示在搜索路徑中以進行導入,而不是PATH。見http://docs.python.org/tutorial/modules.html#the-module-search-path

另外,請看看http://as.ynchrono.us/2007/12/filesystem-structure-of-python-project_21.html它強烈建議你把目錄的額外水平的地方,以便代替lib.aa,你會稱其爲my_proj.lib.aa

0

系統PATH變量一些更多的信息不由python import語句使用。它使用PYTHONPATH,但添加新目錄以導入搜索路徑的最好方法是修改sys.path。

如果這沒有幫助,請將您的sys.path值和os.getcwd()返回的值添加到問題中。

0

我有類似的問題,這裏是我的建議。

而不是更改sys.path,更好地運行您的test.py在proj(即項目根目錄)目錄。這種方式項目目錄將自動在sys.path,您將能夠導入lib包。

並使用絕對導入。