Python导入相对路径

dan*_*451 17 python import path relative-path

我有一个项目,我想在其他目录中使用一些python类.

结构示例:

/dir
 +../subdirA
 +../subdirB
 +../mydir
Run Code Online (Sandbox Code Playgroud)

绝对路径不同,因为该项目在不同的机器上运行.

执行位于/ mydir中的MySampleClass的 python文件时,如何导入位于/ subdirA中的/ dirOtherClassA中的OtherClassRoot

我尝试过这样的事情:

from . import MySampleClass as msc
Run Code Online (Sandbox Code Playgroud)

要么

from ../ import MySampleClass as msc
Run Code Online (Sandbox Code Playgroud)

但这总是失败或给我错误消息,如非包装中尝试相对导入

那么,什么是相对导入python文件的正确方法?

任何输入都非常感谢:)

Wyr*_*ood 20

你需要__init__.py在mydir目录中(并且它可以为空),然后只要dir在sys路径中,假设你的MySampleClass在myfile.py中并且myfile.py在mydir中

from mydir.myfile import MySampleClass
Run Code Online (Sandbox Code Playgroud)

如果要将位于subdirA中的名为util.py的文件中的顶级函数导入myfile.py(您的类所在的位置),则__init__.py必须在subdirA中,然后在myfile.py中

from subdirA.util import somefunc, someotherfunc
Run Code Online (Sandbox Code Playgroud)

sys路径也是如此,也就是说,您必须从'dir'开始或添加它.所有内容都从包的顶层导入(通常是您的项目文件夹).

但是,对于模块测试,您可以在解释器中从util运行函数,如果从subdirA开始,则需要将dir添加到sys路径,以便导入可以解析.

>>> import sys
>>> sys.path.append('../dir')
Run Code Online (Sandbox Code Playgroud)

但这是一个黑客攻击,最好只在你测试时使用解释器.您还可以在pth文件中将"dir"添加到您的站点包中.

要使用相对导入,您需要更深层次的嵌套文件夹,如subdirA/subdirofA,然后在subdirofA中,您可以使用.退出(像from .subdirB).真的,对我来说,相对进口有点难以看到效用.对我来说,相对于项目目录使用直接导入更好,但是如果你想嵌套一个朴素的子包,我可以看到它们很有用,但是如果可能的话,最好还是显式而不是隐式.

也看到这个