包中的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_dir1
成in_dir2
。
我尝试过from .. import in_dir1
并from ..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
以实现此目的。但是到那时,您在绝对进口方面取得了什么成就?