在Python2.7.x中,在包模块中导入是如何工作的?在Python3.x中为什么/如何更改

在Python2.7.x中,在包模块中导入是如何工作的?在Python3.x中为什么/如何更改,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,考虑以下目录结构 driver.py m/__init__.py m/bar.py m/foo.py 包括以下内容 driver.py: import m.foo print("Hello world!") print("I am bar") import bar print("I am foo") m/\uuuu init\uuuu.py:文件为空 m/bar.py: import m.foo print("Hello world!") print("I am bar") impo

考虑以下目录结构

driver.py
m/__init__.py
m/bar.py
m/foo.py
包括以下内容

driver.py:

import m.foo
print("Hello world!")
print("I am bar")
import bar
print("I am foo")
m/\uuuu init\uuuu.py:文件为空

m/bar.py:

import m.foo
print("Hello world!")
print("I am bar")
import bar
print("I am foo")
m/foo.py:

import m.foo
print("Hello world!")
print("I am bar")
import bar
print("I am foo")
运行
python2-driver.py
有效,运行
python3-driver.py
无效(在m/foo.py中ImportError尝试导入bar),这导致我问了几个问题

  • 在Python2.7中,导入包中的内部模块是如何工作的?我清楚的是,如果我在
    driver.py
    (例如
    import m.foo
    )中导入一个模块,这将在
    sys.path
    列表中搜索属于
    \uu main\uuu
    (在本例中为
    driver.py
    )的模块。然而,尚不清楚的是,当
    driver.py
    导入的模块本身进行导入时会发生什么情况(例如
    m/foo.py
    尝试导入
    m/bar.py
    )。似乎
    m/foo.py
    中的
    sys.path
    driver.py
    中的
    sys.path
    相同,因此我不明白当
    m/
    目录不在
    sys.path
    中时,Python 2.7是如何成功导入条形图的

  • Python-2.7和Python-3.x之间发生了什么变化?看来我不得不这么做了

  • 来自。导入条码

    而不是

    导入栏

    m/foo.py
    中,让这个简单的示例在Python-3.x下工作

    更新: 这似乎是改变的原因


    谢谢。

    可能重复@jonrsharpe:您链接到的问题基本上回答了我的第二个问题,但不是第一个问题。要回答第一个问题,默认的CPython实现还将在当前工作目录中查找文件以导入文件。这就是为什么文件m/foo.py和m/bar.py可能具有相对导入。