python-3.x - 从 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
环境变量,但同样,我不想这样做。这个问题没有干净的解决方案吗?
解决方案
不要手动“破解” 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
是绝对导入,因为“应用程序”是顶级文件夹“应用程序”内的一个文件夹。
推荐阅读
- rust - 我怎样才能`fut.await`在“后台”运行未来(执行但不等待它)?
- python - Ariadne GraphQL 订阅:“无法连接到 websocket 端点 ws://localhost:3001/”
- kotlin - 直接在页面底部显示 AppCompatDialog
- python - 文件浏览器和在同一窗口中绘图
- r - 准泊松模型的 Akaike 准则 (AIC)
- rust - 从选项中提取可变引用
- python - 如何通过 Python 将产品导入 Shopware
- python - Pandas df 如何更改特定列以从单元素列表中删除列表
- google-cloud-platform - 打包程序命令卡住了
- python - 转换字典列表中的字符串