首页 > 解决方案 > 从 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环境变量,但同样,我不想这样做。这个问题没有干净的解决方案吗?

标签: python-3.xpython-import

解决方案


不要手动“破解” sys.path。这是您可能从 stackoverflow 答案中学到的一种不好的“快速修复”做法。

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

pip install --editable path/to/myfolder

您只需要在您的程序“myfolder”中添加一个 setup.py,其中包含以下内容

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

名称“myfolder”仅在您想卸载它时才重要。但最终这将在环境站点包中创建您的 myfolder 的符号链接,您可以像以前一样继续编辑。但是您的程序“就像已安装”一样工作。

这比更改 PYTHONPATH 更灵活。

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

from app import x

是绝对导入,因为“应用程序”是顶级文件夹“应用程序”内的一个文件夹。


推荐阅读