从 Python 中的其他目录导入模块 3

Import module from other directory in Python 3

我知道这个问题已经被问过数千次了,但我仍然没有得到正确的答案并且总是遇到同样的问题。

我有以下文件:

application/app/__init__.py

在这里,我有一些变量,让它成为x

那么,我这里还有一个文件:

application/tests/test_1.py

test_1.py 我这样做:

from app import x

并且,在 application 文件夹中,我 运行:

python3 tests/test_1.py

但是出现如下错误:

ModuleNotFoundError: No module named 'app'

一个可行的解决方案是,在 test_1.py 内,添加:

import sys
sys.path.append('../')
from app import db

那么如果我这样做:

cd tests
python3 test_1.py

效果很好,但我不想要那个 sys.path.append 而且我也想

python3 tests/test_1.py

另一个解决方案是显式修改 PYTHONPATH 环境变量,但同样,我不想这样做。这个问题没有一个干净的解决方案吗?

不要手动"hack" sys.path。这是一种不好的做法 "quick fix",您可能已经从 Whosebug 的回答中学到了这一点。

Python 在站点包文件夹或 PYTHONPATH 中查找导入。将本地文件夹放入站点包的最简单方法是使用

pip install --editable path/to/myfolder

你的程序"myfolder"中只需要一个setup.py,内容如下

from setuptools import setup
setup(name='myfolder")

名称 "myfolder" 仅在您要卸载它时才重要。但最终这将在环境站点包中创建您的 myfolder 的符号链接,您可以像以前一样继续编辑。但是你的程序有效 "as if installed".

这比更改 PYTHONPATH 更灵活。

至于其他评论: 当“应用程序”链接到站点包并因此通过 sys.path、

识别时
from app import x

是绝对导入,因为 'app' 是顶级文件夹 'application' 中的一个文件夹。