我知道这个问题已经被问过数千遍了,但是我仍然没有得到正确的答案,总是会偶然发现同一个问题。
我有以下文件:
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
环境变量,但我又不想这样做。没有解决这个问题的干净方法吗?
答案 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”内的文件夹。