包中的Python相对导入不在路径上


问题内容

如何将python包(不在路径中)的父目录中的文件导入子目录中的文件?

我对python包装的词汇并不完全清楚,所以举个例子:

dir1/
    __init__.py
    runner.py
    in_dir1.py
    dir2/
        __init__.py
        in_dir2.py

dir1 / in_dir1.py:

def example():
    print "Hello from dir1/in_dir1.example()"

dir1 / dir2 / in_dir2.py

import in_dir1   #or whatever this should be to make this work
print "Inside in_dir2.py, calling in_dir1.example()"
print in_dir1.example()

考虑到dir1是不是我要找的最佳途径进口蟒蛇路径上in_dir1in_dir2

我尝试过from .. import in_dir1from ..dir1 import in_dir1 基于此Q /
A,
但均无效。执行该意图的正确方法是什么?这个问题似乎包含了答案。但是,我不太确定该怎么做/如何使用PEP
366
实际解决我的问题

这两个__init__.py文件都是空的,我在 v2.6上

我正尝试在不使用Google不断出现的任何路径破解的情况下执行此操作。


问题答案:

答案在您提供的链接中:

相对导入使用模块的__name__属性来确定该模块在包层次结构中的位置。如果模块的名称不包含任何软件包信息(例如,将其设置为“ main
”),则相对导入的解析就好像该模块是顶级模块一样,无论该模块实际位于文件系统上的哪个位置。

您无法在__main__脚本中进行相对导入(即,如果直接运行python in_dir2.py)。

为了解决这个问题,PEP 366允许您执行的操作是设置全局变量__package__

import dir1
if __name__ == '__main__':
    __package__ = 'dir1.dir2'
    from .. import in_dir1

请注意,该包装dir1仍必须打开sys.path!您可以操纵sys.path以实现此目的。但是到那时,您在绝对进口方面取得了什么成就?