2010-11-14 119 views
27

嘿,所有 - 我用Python中的相對導入拉出我的頭髮。我在SO和其他論壇上閱讀過30次文檔和大量文章 - 仍然沒有成功。Python中的相對導入

我的目錄結構目前看起來像這樣

src/ 
    __init__.py 
    main.py 
    components/ 
     __init__.py 
     expander.py 
     language_id.py 
    utilities/ 
     __init__.py 
     functions.py 

我想expander.py和language_id.py有權訪問的功能模塊。我使用components.expander import *和components.language_id import *來運行訪問模塊的python main.py。

然而,內部擴張和LANGUAGE_ID代碼訪問的功能模塊:

from ..utilities.functions import * 

我收到此錯誤:

ValueError: Attempted relative import beyond toplevel package 

我已經在這一堆的時間,它似乎請按照文檔。任何人有任何想法在這裏發生了什麼問題?

+8

你已經找到了解決方案,但解釋了爲什麼需要它:包應該是完全獨立的。當你運行main.py時,它不會將src /視爲一個包。 – 2010-11-14 01:29:01

回答

21

沒關係,我解決了這個問題:然後

src/ 
    main.py 
    mod/ 
     __init__.py 
     components/ 
      __init__.py 
      expander.py 
      language_id.py 
     utilities/ 
      __init__.py 
      functions.py 

main.py指子包爲:

from mod.components.expander import * 
from mod.utilities.functions import * 

expander.py和language_id.py有機會與以functions.py:

from ..utilities.functions import * 

但有趣的是,我有一個文本文件裏面的組件目錄expander.py我們ES。但是,在運行時,即使它位於同一目錄中,也找不到該文件。我將文本文件移動到與main.py相同的目錄中,並且它工作正常。似乎違反直覺。

+13

所有新模塊導入的內容都被破壞並且不直觀。 – 2010-11-14 01:20:13

+3

打開文本文件可以從您啓動程序的工作目錄中運行,而導入是相對於腳本的位置。您可以在模塊中使用\ _ \ _ file \ _ \ _來查找其路徑,因此可以引用同一目錄中的內容,儘管它不是很優雅。如果文本文件是該程序的靜態數據,則將其轉換爲Python模塊可能更容易,並將其導入。 – 2010-11-14 01:23:58

+1

您可以使用'pkgutil.get_data()'(http://docs.python.org/library/pkgutil#pkgutil.get_data)使用模塊名稱空間檢索文件以找到它們。例如,'raw_data = pkgutil.get_data('mod.components','data.txt')'將從文件中檢索原始二進制數據。 – ncoghlan 2011-02-23 04:22:17