导入python类,相对于哪里?

杰杰

如果我有一个小型python项目,该项目分为两个子目录的主目录:

src/
    run.py
    subdir1/
            __init__.py
            module1.py
            subdir2/
                    __init__.py
                    module2.py

为了将module2包含在module1中,我必须使用完整的include路径:(from subdir1.subdir2.module2 import Class2相对于正在运行的python文件),还是可以使用from subdir2.module2 import Class2(相对于该语句所在的文件)

src/
    run.py
    subdir1/
            __init__.py
            module1.py
    subdir2/
            __init__.py
            module2.py

我现在已经尝试过相对于程序的运行位置,如何最好地将module2包含在module1中,即,from subdir2.module2 import Class2但这给出了错误,"No module named module2"我不禁会认为这不是最便携的工作方式,如果这样做会更好相对于存在该语句的文件的路径,尤其是在第一个示例中。

我假设如果我从另一个活动目录中调用代码,它不会弄乱事情,或者会吗? python dir/run.py

谢谢!

g

有两种导入模块的方法:

  1. 绝对进口
  2. 相对进口

绝对导入使python在sys.path相对于当前模块的模块的相对导入地址中存储的目录中查找所需的模块。您只能在python包内使用相对导入。

对于第一种情况,您可以使用相对导入,因为它subdir1是一个包

对于第二个,您不能使用相对导入,因为subdir1subdir2不在软件包中。

根据pep-8:

推荐绝对导入,因为如果导入系统配置不正确(例如,程序包中的目录最终位于sys.path时),则它们通常更具可读性,并且通常表现更好(或至少会提供更好的错误消息):

import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example

但是,显式相对导入是绝对导入的一种可接受的替代方法,特别是在处理复杂的包装布局时,使用绝对导入会变得不必要地冗长:

from . import sibling
from .sibling import example

标准库代码应避免复杂的程序包布局,并始终使用绝对导入。

绝对不要使用隐式相对导入,并且在Python 3中已将其删除。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章