2012-11-14 121 views
2

我一直在用Python包導入。我搜索了網頁,但無法找到合適的答案。Python包導入問題

我有以下目錄結構:

. 
./__init__.py 
./packages/ 
./packages/__init__.py 
./packages/package 
./packages/package/__init__.py 
./packages/package/module.py 

的module.py源只包含一個行:

import package 

如果我去「包」目錄下,我能夠導入包:

>>> import python 
>>> 

如果我去「。」目錄,我想導入模塊(或包)如下:

>>> import packages.package.module as module 

但我得到的錯誤:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "vendor/package/module.py", line 1, in <module> 
    import package 
ImportError: No module named package 

什麼我需要把在__init__。 py文件,所以我可以做上面的導入? 更多,我需要放入./__init__.py文件,所以我可以從../目錄導入我的項目?

如果可能的話,我想在不改變的sys.path變量來解決這個問題。

+0

你首先運行什麼文件?誰開始整個過程​​? – alexvassel

+0

閱讀文檔:http://docs.python.org/2/tutorial/modules.html – codeape

+0

'從packages.package進口module' –

回答

1

運行程序時。所有進口必須與該目錄相關。爲了您的module.py文件這意味着你必須做的

import packages.package 

代替

import package 

這是因爲Python將使用。作爲您在程序中進行的所有進口的基礎。沒有太多的魔力,不可能從父目錄導入某些東西,所以你必須按照上面所示的那樣進行絕對導入。

+0

它工作,但有沒有可能做到這一點,而無需修改包模塊? – kaspersky

+0

我不認爲這很容易。但它不應該,因爲你指的是子模塊中的父代,這可能被認爲是不好的設計,因爲模塊應該儘可能地包含自身。儘管如此,它當然會發生,但只有在一個自包含的項目中,在這種情況下,無論如何你都會從同一個文件開始。 – Nihathrael

2

爲了使module.py中的import package成功,python包package必須是可發現的。這意味着它必須在PYTHONPATH上。默認情況下,此路徑包括site-packages(python包的放置目錄爲easy_installpip)。此外,PYTHONPATH還包括當前的工作目錄。

如果你在.,則.被放置在您的PYTHONPATH的開始。這個目錄確實是而不是包含一個叫做package的python包,因此import package失敗。

您可以移動到./packages開始一個python解釋之前,或者可以安裝你的包。要做後者,你需要一個setup.py

+0

所以我不能通過編輯\ __ init__.py文件來解決這個問題? – kaspersky

+0

你可以操縱packages/__ init__.py中的sys.path以將/ packages目錄添加到它 –

+0

sys.path.insert是我現在使用的解決方案,但我不滿意它。 – kaspersky