2013-05-27 53 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