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