104

我有以下目录结构:

application
    tests
        main.py
    main.py

application/main.py 包含一些功能。

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

ImportError: Import by filename is not supported.

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

import main

我究竟做错了什么?

4

7 回答 7

91

如果您希望脚本更便携,请考虑自动查找父目录:

import os, sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# import ../db.py
import db
于 2015-05-29T18:20:28.667 回答
41

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

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
于 2013-05-27T20:21:08.317 回答
24

首先,您需要通过添加__init__.py文件将目录制作成包:

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

然后你应该确保应用程序上面的目录是 on sys.path。有很多方法可以做到这一点,比如将应用程序打包并安装它,或者只是在正确的文件夹中执行操作等。

然后您的导入将起作用。

于 2013-05-27T20:55:05.037 回答
11

派对迟到了——不幸的是,所有其他答案都是错误的——除了不完整的@LennartRegebro(和@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根包的父目录中的开关运行 - 这样所有包都被检测到并且相对/绝对导入按预期工作。

于 2021-07-08T10:29:40.113 回答
8

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

于 2013-05-27T20:21:02.237 回答
5

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

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

编辑:缺少右括号。

于 2019-10-30T21:03:43.540 回答
-3

在蟒蛇。存在于同一目录,.. 为父目录从父目录导入文件,您可以使用 ..

从 .. 导入文件名(不带 .py 扩展名)

于 2015-08-26T01:32:38.527 回答