python中的“导入模块”和“从。导入模块”之间的区别?

时间:2019-05-16 08:26:02

标签: python python-3.x import

最近,我发现使用“ import M”和“ from。import M”时出现奇怪的错误。我正在使用python3.6。
例如,文档树如下。

test/
├── pacA
│   ├── a1.py
│   ├── a2.py
│   └── utils.py
├── test_a1.py
└── test_a2.py

在utils.py中是func打印机:

def printer(info):
    print(info)

在a1.py中是:

from .utils import printer

def pa():
    printer('printer called in a1.pa()\n')

if __name__ == '__main__':
    printer('pinter called in a1.__main__\n')

在a2.py中是:

from utils import printer

def pa():
    printer('printer called in a2.pa()\n')

if __name__ == '__main__':
    printer('pinter called in a2.__main__\n')

我们可以看到a1.py和a2.py都希望在utils.py中导入打印机。他们正在使用不同的导入方法。这是唯一的区别。
无论我是否从目录pacA /运行a1.py,都会收到以下错误消息:

from .utils import printer
ModuleNotFoundError: No module named '__main__.utils'; '__main__' is not a package

但是运行a2.py将获得正确的答案。

但是,如果我使用另一个.py导入a1和a2,情况就会好转。在test_a1.py中,代码如下:

from pacA import a1

if __name__ == '__main__':
    a1.pa()

在test_a2.py中,代码如下:

from pacA import a2

if __name__ == '__main__':
    a2.pa()

无论是否通过test /运行test_a1.py,我都会得到正确的答案。但是,当我运行test_a2.py时,出现如下错误:

from pacA import a2
  File "/home/gph/Desktop/test/pacA/a2.py", line 1, in <module>
    from utils import printer
ModuleNotFoundError: No module named 'utils'

如何在a1中导入utils.py以使两种情况都正确?

2 个答案:

答案 0 :(得分:0)

尝试这个

pip install utils

python希望您从外部安装utils软件包

希望这会有所帮助

答案 1 :(得分:0)

我想我已经找到了背后的原因。

对于第一个错误,我认为不直接运行a1.py。 在a1.py中使用相对导入from .utils import printer时,不应直接运行a1.py。如果是这样,您将得到错误'__main__' is not a package"。要了解这一点,您需要了解if __name__==__main__的工作方式。

在a2.py中使用from utils import printer时,python将搜索经典路径,包括sys.path中的路径。但是,如果您运行test_a2.py,则不包含pacA,因此我们找不到它。如果要运行test.a2.py,则应在导入utils之前包含此sys.path.append('path to pacA')