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

时间:2020-04-24 20:20:51

标签: python-3.x python-import

我知道这个问题已经被问过数千遍了,但是我仍然没有得到正确的答案,总是会偶然发现同一个问题。

我有以下文件:

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

1 个答案:

答案 0 :(得分:0)

请勿手动“入侵” sys.path。您可能已经从stackoverflow答案中学到了这种错误的“快速修复”方法。

Python在site-packages文件夹或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

是绝对导入,因为“ app”是顶级文件夹“ application”内的文件夹。

相关问题