从父目录导入文件?

Mar*_*ace 47 python

我有以下目录结构:

application
    tests
        main.py
    main.py
Run Code Online (Sandbox Code Playgroud)

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

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

ImportError: Import by filename is not supported.
Run Code Online (Sandbox Code Playgroud)

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

import main
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

小智 51

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

import os, sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# import ../db.py
import db
Run Code Online (Sandbox Code Playgroud)

  • PEP 8:E402 模块级导入不在文件顶部 (3认同)

Mr_*_*s_D 47

8 年后 - 不幸的是,这里的大多数其他答案仍然不正确 - 除了LennartRegebro 的(和 BrenBarn 的)是不完整的。为了未来读者的利益 - OP 首先应该添加文件,__init__.py如下所示

root
    application
        __init__.py
        main.py
        tests
            __init__.py
            main.py
Run Code Online (Sandbox Code Playgroud)

然后:

$ cd root
$ python -m application.tests.main # note no .py
Run Code Online (Sandbox Code Playgroud)

或者

$ cd application
$ python -m tests.main
Run Code Online (Sandbox Code Playgroud)

直接从其包内部运行脚本是一种反模式 - 正确的方法是从根包的父目录-m切换运行 - 这样所有包都会被检测到,并且相对/绝对导入按预期工作。

  • 终于给出正确答案了。多谢! (3认同)

Len*_*bro 16

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

application
    tests
        __init__.py
        main.py
    __init__.py
    main.py
Run Code Online (Sandbox Code Playgroud)

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

那么你的导入就行了.

  • 添加`__init __.py`可以使您的目录成为包而不是模块. (6认同)
  • 正如所写的,这允许从子文件夹或父文件夹导入代码,这不是答案。虽然无论如何它还是有帮助的。 (2认同)

0x9*_*x90 15

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

import sys
sys.path.append("/path/to/dir")
from app import object
Run Code Online (Sandbox Code Playgroud)

或者来自shell:

setenv PATH $PATH:"path/to/dir"
Run Code Online (Sandbox Code Playgroud)

如果你使用windows:在Windows中添加变量到路径.

或者从命令行:

set PATH=%PATH%;C:\path\to\dir
Run Code Online (Sandbox Code Playgroud)


And*_*ley 7

要导入父目录的不同子目录中的文件,请尝试如下操作:

sys.path.append(os.path.abspath('../other_sub_dir'))
import filename_without_py_extension
Run Code Online (Sandbox Code Playgroud)

编辑:缺少右括号。


Bre*_*arn 6

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

  • 没有资格说你不能有点强.如果没有一点额外的努力,你就无法做到,但你所要做的就是将父目录放在路径上,你就可以做到. (3认同)
  • @BryanOakley:这属于我所说的"将它们放在系统路径上". (3认同)
  • + 经过大量的 SOQ 之后,我意识到 python 无法在父目录中查找。 (2认同)