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

Python在包内的相对导入不在路径上,python,packaging,pythonpath,Python,Packaging,Pythonpath,如何将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

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

我试着从。。导入到\u dir1和
from..dir1导入到\u dir1
,但两者都不起作用。执行该意图的正确方式是什么?似乎包含了答案;然而,我不太确定如何利用它/如何使用它来实际解决我的问题

两个
\uuuu init\uuuu.py
文件都是空的,我在v2.6上


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

答案在您提供的链接中:

相对导入使用模块的_name__属性来确定 模块在包层次结构中的位置。如果模块的名称为 不包含任何程序包信息(例如,它被设置为“main”) 然后解析相对导入,就好像模块是顶层一样 模块,而不管模块在文件中的实际位置 系统

您不能在
\uuuu main\uuuu
脚本中进行相对导入(即,如果您在\u dir2.py中直接运行
python)

为了解决这个问题,PEP 366允许您设置全局
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

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

请注意,程序包
dir1
仍必须在
sys.path
上!您可以操纵
sys.path
来实现这一点。但到那时,你在绝对进口方面取得了什么成就?

你实际上可以做到:

import sys
sys.path.append('..')
这会奏效的。但不要那样做。它可能会破坏其他模块

我想你可以在导入后直接删除它,但不要

编辑:

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

在_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

尝试重新构造代码。

相对导入不好,mmmkay?将
dir1
添加到
sys.path
并使用绝对导入。是的,我看到很多人建议在其他地方使用运行时路径黑客(这实际上是我过去使用过的),但每个人都会对sys-path黑客说“不要这样做”,所以。。。“但到那时,你取得了什么成就。。。”“没有。这看起来真的不像是一个边缘案例。如果不在路径上粘贴顶层,我真的无法在包内导入?@Finn,这是一种边缘情况,因为您直接运行包的子模块。而正确的方法是创建一个单独的脚本来导入包/子模块并运行它。@Finn:
python您的_-script.py
将其目录添加到
sys.path
中,因此如果您在任何地方都使用绝对导入,并且
dir1
您的_-script.py
旁边,那么您可以导入任何内容内部
dir1
。芬恩,正是@J.F.塞巴斯蒂安说的。然后,您可以在包内的模块中使用相对导入。@J.F.Sebastian,而不是在包内的模块中。