在Python import语句中使用相对路径有什么意义吗?

时间:2018-11-28 02:18:22

标签: python python-3.x

我有一个名为Util的Python包。它包括一堆文件。这是其中一个文件顶部的include语句:

from config_util import ConfigUtil #ConfigUtil is a class inside the config_util module
import error_helper as eh

当我运行单元测试时,这很好。

当我在另一个软件包的虚拟环境中安装Util时,一切都会中断。我将需要将导入语句更改为

from Util.config_util import ConfigUtil
from Util import error_helper as eh

,然后一切都会像以前一样工作。那么使用第一种形式有什么意义吗?还是可以肯定地说始终使用第二种形式是更好的做法?

如果使用第一种形式毫无意义,那为什么允许它?

2 个答案:

答案 0 :(得分:1)

只是错误:

from config_util import ConfigUtil
import error_helper as eh

仅当您碰巧位于目录Util中时,它才起作用,以便导入在当前工作目录中解析。否则,您会因为一些错误的技巧而误解了sys.path

权利(使用绝对进口):

from Util.config_util import ConfigUtil
import Util.error_helper as eh

也正确(使用相对导入):

from .config_util import ConfigUtil
import .error_helper as eh

使用相对导入并没有特别的优势,我可以想到的只有两点:

  • 在源文件中保存一些字节(那么/谁在乎?)
  • 使您能够重命名顶层,而无需在源代码中编辑导入语句(...但是您多久这样做一次?)

答案 1 :(得分:0)

对于您的实际问题,也许this answer可以为您提供帮助。

关于您的直接问题:没有太多内容,但是它们使您可以更轻松地移动文件和重命名包含目录的内容。您可能还会出于风格原因而偏爱相对导入;我确定。

如果路径正确,则语义相同。如果您的模块是foo.bar,则from foo.bar.baz import Bazfrom .baz import Baz是相同的。如果他们不这样做,那么您可能会以脚本(python foo/bar.py的形式调用Python文件,在这种情况下,它将是模块__main__而不是foo.bar。 / p>