从父目录导入文件?

时间:2013-05-27 20:17:36

标签: python

我有以下目录结构:

application
    tests
        main.py
    main.py

application / main.py包含一些函数。

tests / main.py将包含我对这些函数的测试,但我无法导入顶级main.py.我收到以下错误:

ImportError: Import by filename is not supported.

我尝试使用以下语法导入:

import main

我做错了什么?

7 个答案:

答案 0 :(得分:47)

如果您希望脚本更具可移植性,请考虑自动查找父目录:

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

答案 1 :(得分:14)

您必须将应用程序目录添加到您的路径中:

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

或者来自shell:

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

如果您使用Windows: 在windows中向路径添加变量。

或者从命令行:

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

答案 2 :(得分:13)

首先,您需要通过添加__init__.py个文件将目录设置为包:

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

然后,您应该确保上面的应用程序目录位于sys.path。有很多方法可以做到这一点,比如将应用程序放入包中并进行安装,或只是在正确的文件夹中执行等等。

Then your imports will work.

答案 3 :(得分:6)

您无法从父/兄弟目录中导入内容。您只能从系统路径上的目录或当前目录或程序包中的子目录中导入内容。由于您没有__init__.py个文件,因此您的文件不会形成包,只能通过将它们放在系统路径上来导入它们。

答案 4 :(得分:1)

要在父目录的另一个子目录中导入文件,请尝试以下操作:

sys.path.append(os.path.abspath('../other_sub_dir')
import filename_without_py_extension

答案 5 :(得分:1)

聚会迟到了 - 不幸的是,这里所有其他答案都是错误的 - 除了不完整的 @LennartRegebro's(和@BrenBarn 的)。为了未来读者的利益 - OP 应该首先添加 init 文件,如

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

然后:

$ cd root
$ python -m application.tests.main

$ cd application
$ python -m tests.main

直接从包内部运行脚本是一种反模式——正确的方法是从根包的父目录使用 -m 开关运行——这样所有包都被检测到,相对/绝对导入作为预期。

答案 6 :(得分:-3)

在python中

。存在于同一目录,..表示父目录 要从父目录导入文件,您可以使用..

  

from .. import filename(不带.py扩展名)