本文共 4542 字,大约阅读时间需要 15 分钟。
本篇梳理python3中模块和包的使用细节。
欢迎微信随缘关注@
python模块是一个包含Python定义和语句的文件(就是一个.py结尾的脚本文件);
文件名为模块名,文件后缀为 .py;
在一个模块内部,模块名可以通过 __name__方法获得。
定义一个模块fibo,即创建一个fibo.py文件。
#fibo.py
# Fibonacci numbers moduledef fib(n): # write Fibonacci series up to n a, b = 0, 1 while a < n: print(a, end=' ') a, b = b, a+b print()def fib2(n): # return Fibonacci series up to n result = [] a, b = 0, 1 while a < n: result.append(a) a, b = b, a+b return result
python习惯上把所有 语句放在脚本的开头,全局调用。
>>> import fibo#导入模块fibo>>> fibo.__name__#__name__方法获得模块fibo的模块名'fibo'
>>> import fibo>>> fibo.fib2(100)[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> from fibo import fib,fib2#多个函数名之间使用逗号隔开>>> fib2(100)[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
*表示该模块中所有的函数,会导致代码可读性差(不建议使用)。
>>> from fibo import *>>> fibo.fib2(100)[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
import 模块名 as 别名
>>> import fibo as fb>>> fb.fib2(100)[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
from 模块名 import 函数名 as 函数别名
>>> from fibo import fib2 as fb2>>> fb2(100)[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
#fibo.py
# Fibonacci numbers moduledef fib(n): # write Fibonacci series up to n a, b = 0, 1 while a < n: print(a, end=' ') a, b = b, a+b print()def fib2(n): # return Fibonacci series up to n result = [] a, b = 0, 1 while a < n: result.append(a) a, b = b, a+b return resultif __name__ == "__main__": print("现在该模块被当做脚本执行啦!") print(("此时__name__ == %s"%(__name__)))#此时模块的__name__为__main__ import sys result = fib2(int(sys.argv[1])) print(result)
> python fibo.py 100#if __name__ == "__main__":之后代码块执行了(长用于测试)
现在该模块被当做脚本执行啦!
此时__name__ == __main__
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
__name__是个全局变量,存放模块的名字;
当该模块被其它模块调用时,__name__=模块名,对于fibo.py,__name__="fibo";
当该模块被当做执行脚本时,__name__为__main__( A module’s __name__ is set equal to '__main__' when read from standard input, a script, or from an interactive prompt)。
对于fibo.py,如果终端执行 python fibo.py 100 ,if __name__ == "__main__":后面代码会执行;如果在别的模块中执行import fibo,,if __name__ == "__main__":后面代码不会执行。
>>> import fibo#if __name__ == "__main__":之后代码块没执行
>>>
>>> import fibo>>> dir(fibo)['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'fib', 'fib2']
以__开头和结尾的属性为python的内置属性;
'fib', 'fib2'为自定义属性。
sys.path收集python模块的所有搜索路径,可以自己添加搜索路径(sys.path.append('yourpath'))
举个栗子:
#test.py#!/usr/bin/pythonimport syssys.path.append('~/biosoft/')print(sys.path)
> python test.py['/home/pylearning', '/home/software/anaconda3/lib/python37.zip', '/home/software/anaconda3/lib/python3.7', '/home/.local/lib/python3.7/site-packages', '/home/software/anaconda3/lib/python3.7/site-packages','~/biosoft/']
任何一个python程序执行时,会搜索其导入模块的路径,先搜索内置模块路径;
然后搜索sys.path收集的路径,sys.path中路径依次为:
['/home/pylearning', #被执行程序test.py所在路径
'/home/software/anaconda3/lib/python37.zip',
'/home/software/anaconda3/lib/python3.7', #环境变量PYTHONPATH中路径
'/home/.local/lib/python3.7/site-packages', #标准库路径
'/home/software/anaconda3/lib/python3.7/site-packages',#标准库路径
'~/biosoft/'#自己添加路径]
,effects,filters三个子包。
sound/ #Top-level package(顶层包sound) __init__.py #该文件可以为空,只有该文件存在时sound才会被当做包而不是目录 formats/ #Subpackage(子包) __init__.py #同上,该文件存在时,formats才会被当做包而不是目录 wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py haha.py ... effects/ Subpackage for sound effects __init__.py echo.py surround.py reverse.py haha.py ... filters/ Subpackage for filters __init__.py equalizer.py vocoder.py karaoke.py ...
导入sound包中子包effects中的echo模块
import sound.effects.echo
引用它时必须使用它的全名,sound.effects.echo(xxx)。
from sound.effects import echo
引用方法,echo(xxx)
from sound.effects import *
引用方法,echo(xx)
欢迎微信随缘关注@
转载地址:http://pdmwz.baihongyu.com/