2013-05-27 99 views
24

我有以下目錄結構:從父目錄導入文件?

application 
    tests 
     main.py 
    main.py 

應用/ main.py包含了一些功能。

tests/main.py將包含我對這些函數的測試,但我無法導入頂層main.py。我得到以下錯誤:

ImportError: Import by filename is not supported. 

我嘗試使用下面的語法來導入:

import main 

我在做什麼錯?

+0

我第一次閱讀文檔:http://docs.python.org/2/tutorial /modules.html#packages – Blender

+0

那麼你不能導入你正在處理的文件名。 – squiguy

+0

你在做哪個文件'import main'? – Aivar

回答

4

您不能從父/兄弟目錄導入東西。您只能從系統路徑中的目錄或當前目錄或包中的子目錄導入東西。由於您沒有__init__.py文件,因此您的文件不會形成一個包,而只能通過將它們放在系統路徑中來導入它們。

+1

沒有資格說,你不能有點強。你無法做一點額外的工作,但你所要做的就是把父目錄放在路徑上,你就可以做到。 –

+2

@BryanOakley:這屬於我所說的「將它們放在系統路徑上」。 – BrenBarn

+0

+經過很多SOQ之後,我意識到python在父目錄中查找是盲目的。 – sakhunzai

10

您必須在應用程序目錄添加到您的路徑:

import sys 
sys.path.append("/path/to/dir") 
from app import object 

或者從外殼:

setenv PATH $PATH:"path/to/dir" 

如果您使用Windows: 添加變量在windows路徑。

或者在命令行:

set PATH=%PATH%;C:\path\to\dir 
8

所有你需要讓你的目錄到包,加入__init__.py文件首先:

application 
    tests 
     __init__.py 
     main.py 
    __init__.py 
    main.py 

那麼你應該確保上述應用程序的目錄在sys.path。有很多方法可以做到這一點,如提出申請infto包並安裝它,或者只是在正確的文件夾等執行的東西

Then your imports will work.

+6

添加'__init__。你可以將你的目錄變成包而不是模塊。 – raben

31

如果你想你的腳本更便攜,考慮自動找到父目錄:

import os, sys 
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 
# import ../db.py 
import db 
1

in python。存在相同的目錄,。對於父目錄 來導入您可以使用父目錄中的文件..

from .. import filename (without .py extension)

+1

這對我不起作用,'ValueError:試圖在非包中進行相對導入 – nobism