什么';Python用于导入模块的顺序是什么?

什么';Python用于导入模块的顺序是什么?,python,python-2.7,import,module,Python,Python 2.7,Import,Module,我遇到了python导入语句的一些奇怪之处 假设我的文件结构如下所示: foo\ __init__.py bar.py os.py bar.py中的代码(其他文件为空) 奇怪的是,当我运行python-mfoo.bar时,它会打印出来 foo/os.pyc /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc 但是,当我将direcotry更改为foo,并运行pyt

我遇到了python导入语句的一些奇怪之处

假设我的文件结构如下所示:

foo\
    __init__.py
    bar.py
    os.py
bar.py中的代码(其他文件为空)

奇怪的是,当我运行
python-mfoo.bar
时,它会打印出来

foo/os.pyc
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc
但是,当我将direcotry更改为
foo
,并运行
python-m bar
时,它会打印出来

foo/os.pyc
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc
我运行脚本的两种方式有什么区别?

总之,Python导入模块的顺序是什么?

从官方文件中,我找到了几个关于这个问题的文字(它们让我更加困惑)

  • 解释器首先搜索具有该名称的内置模块。如果未找到,它将在变量sys.path给定的目录列表中搜索名为spam.py的文件

  • 此列表的第一项路径[0]是包含用于调用Python解释器的脚本的目录。如果脚本目录不可用(例如,如果以交互方式调用解释器或从标准输入读取脚本),则路径[0]是空字符串,它将指示Python首先搜索当前目录中的模块

  • 事实上,这种引用非常常见,以至于import语句在查找标准模块搜索路径之前,首先查找包含包

    如果在当前包(当前模块是其子模块的包)中找不到导入的模块,import语句将查找具有给定名称的顶级模块

    我运行脚本的两种方式有什么区别

    区别在于
    foo
    是否(从python的角度)是一个已加载的模块

    如果运行
    python-mfoo.bar
    foo
    是一个有效的模块。即使使用Python2.7,
    导入操作系统
    仍然是一个问题,因此,
    操作系统
    根据包含的模块(即
    foo
    )得到解决,首先:

    :

    子模块通常需要相互引用。例如,环绕声模块可能使用回声模块。事实上,这种引用非常常见,以至于import语句首先在包含包中查找,然后再查找标准模块搜索路径

    运行
    python-m bar
    时,
    bar
    是顶级模块,即它没有包含模块。在这种情况下,
    import os
    通过
    sys.path
    进入

    导入bla的默认模块搜索为

  • 如果存在包含模块,则对包含模块执行相对导入
  • 进入
    sys.path
    并使用第一次成功导入
  • 要禁用(1),您可以

    在模块的最顶端


    困惑?绝对正确。

    [包含软件包]>内置模块>系统路径