好的,我的文件结构如下:
这就是我的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在同一个目录中,为什么我需要在目录名前加上前缀,就好像在项目的根目录下一样?
答案 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