我有以下目录结构:
application
tests
main.py
main.py
application/main.py 包含一些功能。
tests/main.py 将包含我对这些函数的测试,但我无法导入顶级 main.py。我收到以下错误:
ImportError: Import by filename is not supported.
我正在尝试使用以下语法导入:
import main
我究竟做错了什么?
我有以下目录结构:
application
tests
main.py
main.py
application/main.py 包含一些功能。
tests/main.py 将包含我对这些函数的测试,但我无法导入顶级 main.py。我收到以下错误:
ImportError: Import by filename is not supported.
我正在尝试使用以下语法导入:
import main
我究竟做错了什么?
如果您希望脚本更便携,请考虑自动查找父目录:
import os, sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# import ../db.py
import db
您必须将应用程序目录添加到您的路径:
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
首先,您需要通过添加__init__.py
文件将目录制作成包:
application
tests
__init__.py
main.py
__init__.py
main.py
然后你应该确保应用程序上面的目录是 on sys.path
。有很多方法可以做到这一点,比如将应用程序打包并安装它,或者只是在正确的文件夹中执行操作等。
派对迟到了——不幸的是,所有其他答案都是错误的——除了不完整的@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
根包的父目录中的开关运行 - 这样所有包都被检测到并且相对/绝对导入按预期工作。
您不能从父/兄弟目录中导入内容。您只能从系统路径上的目录、当前目录或包中的子目录导入内容。由于您没有__init__.py
文件,因此您的文件不会形成一个包,您只能通过将它们放在系统路径上来导入它们。
要在父目录的不同子目录中导入文件,请尝试以下操作:
sys.path.append(os.path.abspath('../other_sub_dir'))
import filename_without_py_extension
编辑:缺少右括号。
在蟒蛇。存在于同一目录,.. 为父目录从父目录导入文件,您可以使用 ..
从 .. 导入文件名(不带 .py 扩展名)