Python文件名不能与引用的模块名冲突

2019年7月27日 / 40次阅读 / Last Modified 2019年7月27日
安装配置

Python代码中,import引用别的模块,不管是标准库中的模块,还是通过pip安装的第三方模块,需要注意一个细节:文件名不能与引用的模块名冲突!

一个冲突的case

假设自己写了一个.py文件,名为email.py,内容如下:

print('i am not standard email module.')
from email import encoders

这个email.py什么都不管,打印一行字后,就引用Python标准模块email。执行这段程序的时候,会出现以下错误:

E:\py>python email.py
i am not standard email module.
i am not standard email module.
Traceback (most recent call last):
  File "email.py", line 2, in 
    from email import encoders
  File "E:\py\email.py", line 2, in 
    from email import encoders
ImportError: cannot import name 'encoders' from 'email' (E:\py\email.py)

是的,你没看错!那一行打印,打印了两遍,为什么?

Python解释器按顺序读取脚本来执行,首先就是print打印,然后遇到from ... import ...语句,本想引用标准库中的email模块,但是很不幸,当前执行的这个.py文件也是email模块(.py文件都是一个模块哦)。因此,Python解释器就首先将同目录下的email模块引用了,这个模块的第一行语句就是print打印,因此打印了两次。然后,报错,ImportError!

这个错误信息其实很容易让人摸不到头脑,不能从email模块中引入encoders对象,但是标准库中的email模块就有这个encoders呀!!ImportError那一行最后的括号给出了提示,Python解释器引入的不是标准库的email模块,而是E:\py\email.py

确保文件名不要冲突

上一段的case,只需要将email.py这个名字修改一下,比如test_email.py,就解决了问题。

解决问题的方法,就是Python的文件名不要与引入的模块名冲突!

这个case是与标准库冲突。我之前还遇到一次,文件名与一个第三方模块名冲突的情况,请参考这篇文章:https://www.maixj.net/ict/wenjianming-20252

我居然犯了两次同样的错误,因此再写一篇,引以为戒!

-- EOF --

本文链接:https://www.pynote.net/archives/689

留言区

《Python文件名不能与引用的模块名冲突》有1条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    还有一个角度来看此问题,文中的case是“自己import自己”。 [回复]


前一篇:
后一篇:

More

麦新杰的Python笔记

Ctrl+D 收藏本页


©Copyright 麦新杰 Since 2019 Python笔记

go to top