Python-是否相对于其当前目录打包?

时间:2018-06-25 00:53:18

标签: python python-3.x

好的,我的文件结构如下:

  • main.py /
  • paquete /
    • __ init __。py
    • test1.py

这就是我的main.py中的内容:

from paquete import testFunc


def main():
    testFunc()


if __name__ == '__main__':
    main()

这就是我的test1.py中的内容:

def testFunc():
    print("Hello from test1 function!")

这就是我的__ init__.py中的内容:

from test1 import testFunc

但这不起作用,它说没有名为test1的模块。

但是,如果我有类似的东西:

from paquete.test1 import testFunc

效果很好。但是我不明白,如果__ init__.py与test1在同一个目录中,为什么我需要在目录名前加上前缀,就好像在项目的根目录下一样?

2 个答案:

答案 0 :(得分:2)

您当前正在使用的被称为隐式相对导入。。在Python 3.x中已弃用,PEP 8中对此进行了提及。

您仍然可以使用相对导入;它只需要使用下面描述的syntax,并带有前导点:

  

这些导入使用前导点表示相对导入中涉及的当前和父软件包。

# Relative
from .test1 import testFunc

# Absolute
from paquete.test1 import testFunc

还有reference-

  

相对导入的唯一可接受语法是from .[module] import name。所有不以.开头的导入形式都被解释为绝对导入。 (PEP 0328)。

答案 1 :(得分:1)

这是因为paquete在您的sys.path中,但包装的内部没有。因此,您可以为paquete软件包进行绝对导入,但只能对其内部进行相对导入。 paquete位于您sys.path上,因为它与您main.py在同一目录中。

您可以在导入之前设置__path__属性,以获取import语句要考虑的软件包内部。

请参阅https://docs.python.org/3/reference/import.html#module-path