python-3.x - 使用没有包的相对路径
问题描述
关于 python 中的相对路径的主题已经发布了几个问题,看起来这仍然是一个相当令人困惑的主题,并且没有提到最终的结论。我在https://github.com/wweiradio/pkg-relative-import中找到了最具说明性的示例
但是,当我对这些文件进行一些更改时,我再次收到一些错误消息。经过一些调试,我想出了以下有效的文件和目录结构。(在下面提到的层次结构中,我已经提到了每个文件中的导入,哪些导入有效,哪些无效。)
注意:(1)代码有效,无论 __init__.py 文件是否存在。所以我已经删除了所有这些文件。(2) 提到的文件只包含提到的导入行,可能还有一些打印语句,没有别的。
我将代码运行为:
cd top_level; python3 start1.py --> this works
cd top_level/src; python3 start2.py --> this does not work, as expected
我从这个练习中学到了以下教训:
(1) 不允许调用目录上的相对路径,或者它之外的任何地方。
(2) 任何进一步的导入都应该是明确的相对的(例如 .sub3,而不是 sub3),或绝对参考顶层(例如 src.sub2.sub3)
(3) 相对路径与包无关,也与有无__init__.py无关。例如,在下面的代码中,我删除了所有的init .py,它仍然有效
(4) 当前目录为 .,其父级为 ..,其祖父级为 ...,等等
您能否确认这些课程是否正确,在使用相对路径时我还需要记住其他一些因素吗?
目录结构:
- top_level/
- top.py
- start1.py --> import src.sub.relative
- src/
- parent.py
- start2.py --> import sub.relative
- sub/
- relative.py --> from .. import parent
from ..sub2 import relative2
# these imports give error if start2.py is called
# this is understood, so we call only start1.py
- sub2/
- relative2.py --> import top
from .. import parent
#from sub3 import relative3 # --> doesnt work
from .sub3 import relative3 # --> works
from src.sub2.sub3 import relative3 # --> works
#import sub3.relative3 # --> doesnt work
import src.sub2.sub3.relative3 # --> works
- sub3/
- relative3.py --> import top
from ... import parent
解决方案
推荐阅读
- pandas - How to count each x entries and mark the occurence of this sequence with a value in a pandas dataframe?
- xaml - 如何覆盖 xamarin 表单中某些元素的父布局/视图不透明度?
- javascript - 我应该为 material-ui 图标使用什么道具类型?
- openxml - 显示/交互/可见 ClosedXML Excel.XLWorkbook 不保存
- java - hibernate : 如果不为空,则绑定参数
- php - 如何为查询选择的每个结果插入一个新行
- react-native - IOS 12.02 中的 react-native 可触摸不透明度点击问题
- wso2 - WSO2 5.3.0 - 从 Azure 进行联合身份验证后,多因素身份验证不起作用
- php - Mpdf 使用 pdf 模板创建新的 pdf 文档
- json - 如何在颤动中解析地图Json列表?