Python的模块主要是用于把定义的类,函数等保存到一个文件里,以便复用。
先看看怎么声明和使用一个模块:
下面定义了Fibonacci数列的函数,在fib.py文件中。
# Fibonacci numbers module
def fib(n): # write Fibonacci series up to n
a, b = 0, 1
while b < n:
print b,
a, b = b, a+b
def fib2(n): # return Fibonacci series up to n
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result
在需要调用fib, fib2函数的地方,import上面那个脚本文件,然后就可以调用其中的函数了:
>>> import fib
>>> fib.fib2(10)
[1, 1, 2, 3, 5, 8]
>>> fib.__name__
'fib'
Python是如何搜索一个Module对应的脚本文件的
在上面import语句部分,我们只给出了模块名称,并没有提供脚本文件的路径,那么Python是怎么找到这个文件呢?
Python在处理import语句给出的模块名时,首先在内置的模块中寻找;
如果该模块不是Python自带的内置模块,就在sys.path指定的一系列路径下寻找:
- 当前路径,比如在linux下,把fib.py保存到home目录,而在home目录执行python,就可以成功地import fib模块;
- PYTHONPATH环境变量;
Python脚本可以在程序中修改sys.path路径。
举个例子(设置PYTHONPATH环境变量)
travis@travis-ubuntu1310:/usr$ export PYTHONPATH=/home/travis
travis@travis-ubuntu1310:/usr$
travis@travis-ubuntu1310:/usr$ python
Python 2.7.5+ (default, Sep 19 2013, 13:48:49)
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import fib
>>> fib.fib2(10)
[1, 1, 2, 3, 5, 8]
>>>
为啥在可执行Python脚本文件中要加 if __name__ == "__main__":
在Python的模块中,除了包含函数定义等等之外,还可以包含可执行语句,这些语句一般是为了初始化模块用的,并只在首次被import时执行。但它们也能在模块作为脚本文件运行时候执行。显然,我们需要区分这两种情况,这时就需要__name__判断语句。先在fib.py中加入一行打印语句:
print ‘Executing fib.py’
再次import(或者reload)这个模块时,这句话就被执行,比如:
>>> import fib
Executing fib.py
>>>
现在编辑fib.py文件,改为如下形式:
# Fibonacci numbers module
def fib(n): # write Fibonacci series up to n
a, b = 0, 1
while b < n:
print b,
a, b = b, a+b
def fib2(n): # return Fibonacci series up to n
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result
if __name__ == '__main__':
print 'Executing fib.py'
这时import fib或者(reload(fib)),print 语句就不会执行。
而运行脚本就可以看到print语句执行:
travis@travis-ubuntu1310:/usr$ python ~/fib.py
Executing fib.py