python - 为什么 Python 3.x 找不到我的导入?(相对或绝对)
问题描述
我将用我继承了这段代码并且仍在学习 Python 的导入这一事实作为开头。我尝试添加相对路径、绝对路径,并开始将文件夹附加到我的 sys 路径(我了解到这样做非常糟糕)。似乎每个人在 Python 中成功声明路径的方式和我声明路径的方式都不一致,当我问大多数人时告诉我“好吧,它只是工作”或者他们不确定为什么我的导入不起作用。因此,尽管没有必要回答这个问题,但任何关于最佳实践的讨论都会受到赞赏。
这个应用程序显然应该在没有任何编辑的情况下工作。我有一个 docker 容器,其文件夹结构如下:
- app
- sim
- __init__.py
- notebook.ipynb
- src
- __init__.py
- model.py
- factory.py
- utils.py
在notebook
中,我尝试model.py
使用以下方法导入一个函数:
sys.path.append("../")
sys.path.append("../src")
from src.model import some_fcn
这会引发错误:module 'src' has no attribute 'utils'
因为src.utils
imports factory
. 完整跟踪:
<ipython-input-2-a807>
---> 14 from model import some_fcn
/app/src/model.py in <module>
11 import copy
12
---> 13 import src.utils as utils
/app/src/utils.py in <module>
14 import scipy
---> 15 import src.factory
17 import src.model as model
/app/src/factory.py in <module>
7 import numpy as np
----> 8 import src.utils as utils
9
值得注意的是,原来的笔记本有
sys.path.append("../")
from model import some_fcn
而且我不知道这过去是如何工作的,因为找不到 model.py !诡异的。
总之,嵌套导入会导致错误。这不是我第一次遇到这些嵌套导入问题,我不知道如何解决它们,如果它是我的 docker 的问题,或者是我的设置的问题。项目是否需要重组?这是如何工作的?我怎样才能让它工作?我正在积极尝试避免对他们的代码进行编辑,但这已成为经常发生的事情,我不确定我做错了什么。
解决方案
推荐阅读
- python - 在Python中,如何计算多列中高于一列元素的元素数量?
- javascript - 使用 setInterval 在我的游戏中的敏感性不起作用(js)
- c# - 在 C# 测试方法中使用 for 循环生成 DataRow 参数
- android - 单击onBackPressed按钮后AppBarLayout无法显示
- python-3.x - 如何解决 workon:commnad not found for virtualenv?
- html - ngAfterViewInit 更改时,Angular 不会将值更新为 View
- ios - 当嵌套的 UITextView 开始编辑时,UICollectionView 跳转/滚动
- javascript - dataframe.js - 是否可以对分组数据框中的多列求和?
- http - 不带路径的 curl CONNECT 方法(改为目标主机名和端口)
- visual-studio-code - 企业防火墙后面的 VSCode,扩展显示“安装失败”