空__init__.py是否会干扰直接导入并导致错误?

时间:2018-02-21 17:55:01

标签: python python-3.x

有些代码已被重构以使直接导入,并且有一些混乱的恢复提交等。我得到一个ImportError并且不太了解Python导入系统以便知道原因。花了很长时间看分支机构之间的比较等但却找不到它是什么..

鉴于以下目录结构,

our_project/
    __init__.py
    directory1/
        __init__.py
        file1.py
        file2.py
        file3.py
    directory2/
        __init__.py
        file3.py
        file4.py
        file5.py
    directory3/
        __init__.py
        file6.py
        file7.py
        file8.py

除了__init__.py目录中包含一些代码的our_project/之外,所有directory3/file7.py都是空的。

ImportError顶部的以下内容是否有效,而不会导致from out_project.directory1.file1 import my_function

from our_project.directory1 import my_function

或者你需要写

__init__.py

感觉好像这个空console.log以某种方式干扰了事情。

2 个答案:

答案 0 :(得分:2)

文件夹布局建议的顶级包是our_project。这意味着包含它的文件夹应该在Python搜索路径中。

然后您可以使用from our_project.directory1.file1 import my_function从任何地方进行绝对导入。

my_project.directory3.file7模块中,您可以改为使用相对导入from ..directory1.file1 import my_function

如果您将file7.py作为脚本运行(在命令行中使用python file7.py),则相对导入可能无效。通过文件名运行包中的脚本通常是一个坏主意,因为解释器将无法分辨它们应该放在包层次结构中的位置。而是使用python -m our_project.directory4.file7以其绝对名称运行模块。

以下是python docs的链接,其中有一个很好的教程,其中解释了所有内容。

答案 1 :(得分:2)

init .py文件只是告诉python将该目录视为python包,所以我相信你将如何导入取决于系统上安装了哪些软件包(它会搜索你的PYTHONPATH找到已安装的软件包/模块)。如果只安装了示例中的our_project包,则需要像

一样导入
 from our_package.directory1.file1 import my_function

您还可以使用相对导入,无论安装什么都可以使用

  from .directory1.file1 import my_function

有关软件包的文档位于:https://docs.python.org/3/tutorial/modules.html#packages

模块搜索路径的信息在这里: https://docs.python.org/3/tutorial/modules.html#the-module-search-path