Python中的模块导入

写Python时偶尔会遇到"ImportError: No module named ****"这样的错误。一般也就是由于把模块名写错,或者压根没装某个库的原因。今天在Windows下装了wxPython,先拿个简单的程序测试了一下,却意外地报错:"'module' object has no attribute 'Frame'",代码是wxPIA上的例子,在Linux下跑过没有问题的,wxPython的安装一路点next,也没什么需要设置的地方。而且wx模块已经正确引入了,却但是解释器却告诉我没有Frame!百思不得其解。

在交互式解释器中用wx写了一段,却完全没有问题!真是奇了!

反复巡视几遍,终于还是发现了问题所在。原来,我保存文件的时候,随意取了wx.py的文件名。于是我猜到了出错的原因,程序开头的"import wx"把这个文件本身作为一个模块引进来了,因此自然没有程序中用的类。修改文件名,果然解决问题。

反思了一下,虽然是个小错,也反映出自己对程序运行机制的模糊,知其然而不知其所以然。因此研究了一下Python模块导入的过程。Python中的一个模块一般就是一个.py文件,当我们使用import语句的时候,Python解释器是怎样找到对应的文件的呢?这就涉及到Python的搜索路径,搜索路径是由一系列目录名组成的,Python解释器就依次从这些目录中去寻找锁引入的模块。这看起来很像环境变量,事实上,也可以通过定义环境变量的方式来确定搜索路径。搜索路径是在Python编译或安装的时候确定的,安装新的库应该也会修改。搜索路径被存储在sys模块中的path变量,做一个简单的实验,在交互式解释器中,输入以下代码:

import sys
sys.path

即可动态载入当前的搜索路径。输出是一个列表,其中第一项是空串'',代表当前目录(若是从一个脚本中打印出来的话,可以更清楚地看出是哪个目录),亦即我们执行python解释器的目录(对于脚本的话就是运行的脚本所在的目录)。因此若像我一样在当前目录下存在与要引入模块同名的文件,就会把要引入的模块屏蔽掉。

了解了搜索路径的概念,就可以在脚本中修改sys.path来引入一些不在搜索路径中的模块。

你可能感兴趣的:(Python中的模块导入)