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

时间:2012-01-25 22:45:55

标签: python packaging pythonpath

如何将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不在python路径上,我正在寻找将in_dir1导入in_dir2的最佳方法。

我尝试了from .. import in_dir1from ..dir1 import in_dir1 based on this Q/A,但都没有效果。执行该意图的正确方法是什么? This Q/A似乎包含答案;但是,我不太清楚如何使用PEP 366

来解决我的问题

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

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

2 个答案:

答案 0 :(得分: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来实现此目的。但到那时,你对绝对进口有什么影响?

答案 1 :(得分: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

尽量重新构建代码。