前言

最近在学习使用Python的igraph包进行网络分析,在使用igraph.Graph创建图的过程中,总是报错“module has no attribute Graph”,开始以为是windows不行,换了Linux,发现Linux同样不行,最后发现了原因,就是因为我把要运行的代码文件命名为了igraph.py,导致Python解释器认为我的igraph.py是一个模块,igraph.py当然没有Graph模块了,所以会报错。经过这次这个教训,我决定复习下Python的模块机制

模块是程序

任何Python程序都可以作为模块导入。例如,你定义了一个hello.py文件,同时设置了环境变量,那么你就可以导入该模块。

1
2
3
>>> import sys
>>> sys.path.append('/文件hello.py路径')
>>> import hello

注意:导入模块“只导入一次”,导入模块并不意味着在导入时执行某些操作,它们主要用于定义,比如变量、函数、类。只导入一次可以避免导入的无线循环。

模块用于定义

模块在第一次导入到程序中时被执行。它们保持自己的作用域,其中定义的类、函数、变量都成为了模块的特性。

在模块中定义函数

如我在a.py中定义了helllo函数,同时在b.py中定义了hello函数,我们来看一看调用的区别。

a.py

1
2
def hello():
print "a.py"

b.py

1
2
def hello():
print "b.py"

体会模块保持自己的作用域

1
2
3
4
>>> from a import *
>>> from b import *
>>> hello()
# 输出b.py,b覆盖了a

1
2
3
4
>>> from a import *
>>> from b import *
>>> a.hello()
# 输出a.py

在模块中增加测试代码

我们可以设置模块本身是作为程序运行还是导入到其他程序。

为此,我们可以使用Python中的变量name,在“主程序”(包括解释器的交互提示符在内)中,变量name的值是”main“,而在导入的模块中,这个值被设定为模块的名字。

1
2
3
4
5
6
7
8
def hello():
print "Hello world!"
def test():
hello()
if __name__ == "__main__": test()


让你的模块可用

导入模块,执行程序时,解释器在sys.path的路径列表中查找模块。有两种方式可以让你的模块被查找。

1.将模块放置在合适的位置,只需要找出Python解释器在哪里查找模块。可以将模块放到下面输出位置中。

1
2
3
4
5
6
>>> import sys, pprint
>>> pprint.pprint(sys.path)
['C:\\Python27\\Lib',
'xxx'
'xxx'
]

2.在PYTHONPATH环境变量中包含模块所在目录。

3.临时解决方案:sys.pat.append(“/xxx”)