Python在包内的相对导入不在路径上
如何将python包中父目录中的文件(不在路径上)导入子目录中的文件 我不太清楚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
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,而不是在包内的模块中。