首页 > 解决方案 > 使用没有包的相对路径

问题描述

关于 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

标签: python-3.x

解决方案


推荐阅读