我有一个名为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
,然后一切都会像以前一样工作。那么使用第一种形式有什么意义吗?还是可以肯定地说始终使用第二种形式是更好的做法?
如果使用第一种形式毫无意义,那为什么允许它?
答案 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 Baz
和from .baz import Baz
是相同的。如果他们不这样做,那么您可能会以脚本(python foo/bar.py
的形式调用Python文件,在这种情况下,它将是模块__main__
而不是foo.bar
。 / p>