4

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

我对python包装的词汇并不完全清楚,例如:

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

目录1/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不在 python 路径上,我正在寻找in_dir1导入in_dir2.

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

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

我试图在不使用谷歌不断出现的任何路径黑客的情况下做到这一点。

4

2 回答 2

2

答案在您提供的链接中:

相对导入使用模块的 __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来实现这一点。但是到那时,您在绝对进口方面取得了什么成就?

于 2012-01-25T22:49:57.363 回答
0

您实际上可以这样做:

import sys
sys.path.append('..')

这将起作用。但不要那样做。它可能会破坏其他模块。

我想您可以在导入后直接将其删除,但不要。

编辑:

实际上,这也有效,我认为没有理由不安全:

在 in_dir2.py 你可以这样做:

import sys
import os
current_module = sys.modules[__name__]
indir2file=current_module.__file__
sys.path.append(os.path.dirname(os.path.abspath(indir2file))+os.sep+".."+os.sep)
import in_dir1

努力重组你的代码。

于 2012-01-25T22:57:53.733 回答