五、python模块以及包
模块:编写的别的程序中重用一些代码。
1 模块的写法:
- 创建一个.py文件,该文件中包含函数与变量。
- 使用撰写python解释器本身的本地语言来编写模块。比如使用C代码编写python模块,并且在编译后,可以通过标准的python解释器在你的python代码中使用它们。
2 使用标准库模块例子(sys 模块包含了与 Python 解释器及其环境相关的功能,也就是所谓的系统功能( system) ),代码如下:
import sys print('The command line arguments are:') for i in sys.argv: print(i) print('\n\nThe PYTHONPATH is', sys.path, '\n') #程序输出 The command line arguments are: F:/python/demo/test.py The PYTHONPATH is ['F:\\python\\demo', 'F:\\python\\demo', 'C:\\Windows\\system32\\python34.zip', 'I:\\Python34\\DLLs', 'I:\\Python34\\lib', 'I:\\Python34', 'I:\\Python34\\lib\\site-packages']
分析:在这一案例中,由于其是一个内置模块,因此 Python 知道应该在哪里找到它。如果它不是一个已编译好的模块,即用 Python 编写的模块,那么 Python 解释器将从它的sys.path 变量所提供的目录中进行搜索。如果找到了对应模块,则该模块中的语句将开始运行,并能够为你所使用。
你可以直接导入位于当前目录的模块。否则,你必须将你的模块放置在sys.path 内所列出的目录中。另外要注意的是当前目录指的是程序启动的目录。你可以通过运行 import os;print(os.getcwd()) 来查看你的程序目前所处在的目录。
3 .pyc文件?
按字节码编译的文件。.pyc 文件在你下一次从其它不同的程序导入模块时非常有用——它将更加快速,因为导入模块时所需要的一部分处理工作已经完成了。同时,这些按字节码编译的文件是独立于运行平台的。
注意:这些 .pyc 文件通常会创建在与对应的 .py 文件所处的目录中。如果 Python 没有相应的权限对这一目录进行写入文件的操作,那么 .pyc 文件将不会被创建。
4 from..import语句。
- 常规用法(包含从同级.py文件中引入函数或者变量):
from math import sqrt print("Square root of 16 is", sqrt(16)) #结果输出 Square root of 16 is 4.0
2 从自定义包中引入包中.py的函数:例如 from mypacket.hello import *
from util import MongoUtil # from util.MongoUtil import * #如果是第一种方法,则使用MongoUtil内部函数时候,需要MongoUtil.function() #如果用第二种方法,则不用加前缀,可以直接使用。
5 模块的__name__属性
确定模块是独立运行的还是被导入进来运行 ,例如:
#在test.py文件中写入如下代码: if __name__ == '__main__': print('This program is being run by itself') else: print('I am being imported from another module') #运行以后输出This program is being run by itself #在同一目录下新建test2.py文件,输入 import test #运行以后输出I am being imported from another module'
6 编写自己的模块
#在mymodule.py中写入如下代码 def say_hi(): print('Hi, this is mymodule speaking.') __version__ = '0.1' #另一个模块mymodule_demo.py中写入如下测试代码:: import mymodule mymodule.say_hi() print('Version', mymodule.__version__) #另外一种导入方式 from mymodule import say_hi,__version__ say_hi() print("version",__version__)
注意:自己的模块应该放置于与其它我们即将导入这一模块的程序相同的目录下,或者放置在sys.path所列出的其中一个目录下。
7 dir函数
内置的 dir() 函数能够返回由对象所定义的名称列表 ,例如;
import sys print(dir(sys)) #结果 ['__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe', '_home', '_mercurial', '_xoptions', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'getallocatedblocks', 'getcheckinterval', 'getdefaultencoding', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'getwindowsversion', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info', 'version', 'version_info', 'warnoptions', 'winver']
8 包
变量通常位于函数内部,函数与全局变量通常位于模块内部。如果你希望组织起这些模块的话,应该怎么办?这便是包
包是指一个包含模块与一个特殊的 __init__.py 文件的文件夹,后者向 Python 表明这一文
件夹是特别的,因为其包含了 Python 模块
注:参考《byte-of-python-chinese-edition》