什么是模块?

        在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。

        为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python里,一个 .py 文件就被称之为一个模块(Module)。

使用模块有什么好处?

       1.最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。带一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。

       2.使用模块还可以避免函数名和变量名冲突。每个模块有独立的命名空间,因此相同名字的函数和变量完全可以分别存在不同的模块中,所以,我们自己在编写模块时,不必考虑名字会与其他模块冲突。

模块分类

模块分为三类:

  • 内置标准模块(又称标准库)执行 help('models') 查看所有 python 自带模块列表
>>> help('modules')

Please wait a moment while I gather a list of all available modules...

__future__          _tkinter            gettext             sched
_abc                _tracemalloc        glob                secrets
_ast                _warnings           gzip                select
_asyncio            _weakref            hashlib             selectors
_bisect             _weakrefset         heapq               setuptools
_blake2             _winapi             hmac                shelve
_bootlocale         abc                 html                shlex
_bz2                aifc                http                shutil
_codecs             antigravity         idlelib             signal
_codecs_cn          argparse            imaplib             site
_codecs_hk          array               imghdr              smtpd
_codecs_iso2022     ast                 imp                 smtplib
_codecs_jp          asynchat            importlib           sndhdr
_codecs_kr          asyncio             inspect             socket
_codecs_tw          asyncore            io                  socketserver
_collections        atexit              ipaddress           sqlite3
_collections_abc    audioop             itertools           sre_compile
_compat_pickle      base64              json                sre_constants
_compression        bdb                 keyword             sre_parse
_contextvars        binascii            lib2to3             ssl
_csv                binhex              linecache           stat
_ctypes             bisect              locale              statistics
_ctypes_test        builtins            logging             string
_datetime           bz2                 lzma                stringprep
_decimal            cProfile            macpath             struct
_distutils_findvs   calendar            mailbox             subprocess
_dummy_thread       cgi                 mailcap             sunau
_elementtree        cgitb               marshal             symbol
_functools          chunk               math                symtable
_hashlib            cmath               mimetypes           sys
_heapq              cmd                 mmap                sysconfig
_imp                code                modulefinder        tabnanny
_io                 codecs              msilib              tarfile
_json               codeop              msvcrt              telnetlib
_locale             collections         multiprocessing     tempfile
_lsprof             colorsys            netrc               test
_lzma               compileall          nntplib             textwrap
_markupbase         concurrent          nt                  this
_md5                configparser        ntpath              threading
_msi                contextlib          nturl2path          time
_multibytecodec     contextvars         numbers             timeit
_multiprocessing    copy                opcode              tkinter
_opcode             copyreg             operator            token
_operator           crypt               optparse            tokenize
_osx_support        csv                 os                  trace
_overlapped         ctypes              parser              traceback
_pickle             curses              pathlib             tracemalloc
_py_abc             dataclasses         pdb                 tty
_pydecimal          datetime            pickle              turtle
_pyio               dbm                 pickletools         turtledemo
_queue              decimal             pip                 types
_random             difflib             pipes               typing
_sha1               dis                 pkg_resources       unicodedata
_sha256             distutils           pkgutil             unittest
_sha3               doctest             platform            urllib
_sha512             dummy_threading     plistlib            uu
_signal             easy_install        poplib              uuid
_sitebuiltins       email               posixpath           venv
_socket             encodings           pprint              warnings
_sqlite3            ensurepip           profile             wave
_sre                enum                pstats              weakref
_ssl                errno               pty                 webbrowser
_stat               faulthandler        py_compile          winreg
_string             filecmp             pyclbr              winsound
_strptime           fileinput           pydoc               wsgiref
_struct             fnmatch             pydoc_data          xdrlib
_symtable           formatter           pyexpat             xml
_testbuffer         fractions           queue               xmlrpc
_testcapi           ftplib              quopri              xxsubtype
_testconsole        functools           random              zipapp
_testimportmultiple gc                  re                  zipfile
_testmultiphase     genericpath         reprlib             zipimport
_thread             getopt              rlcompleter         zlib
_threading_local    getpass             runpy

Enter any module name to get more help.  Or, type "modules spam" to search
for modules whose name or summary contain the string "spam".
  • 第三方开源模块,可通过 pip install 模块名 联网安装
  • 自定义模块

模块调用

import module
from module import xx
from module.xx.xx import xx as rename  #有的模块名太长,就重新命名一下,用起来方便
from module.xx.xx import *  #将module.xx.xx里的所有模块全部引入,但不推荐,变量名易重复出问题

注意:模块一旦被调用,即相当于执行了另外一个py文件里的代码。

自定义模块

这个最简单,创建一个 .py 文件就可以称之为模块,就可以在另一个程序里导入

模块查找路径

发现,自己写的模块只能在当前路径下的程序里才能导入,换一个目录再导入自己的模块就报错说找不到了,这是为什么?

这与导入路经有关

>>> import sys
>>> sys.path #cmd里面打开python,引入模块的搜索路径
['', 'D:\\Software\\Python\\python37.zip', 'D:\\Software\\Python\\DLLs', 'D:\\Software\\Python\\lib', 'D:\\Software\\Python', 'D:\\Software\\Python\\lib\\site-packages'] #最后一个 site-pages 表示所有的第三方的内置库和自己下载的库都在这里

python解释器会按照列表顺序去依次到每个目录下去匹配你要导入的模块名,只要在一个目录下匹配到了该模块名就立刻导入,不再继续往后找。

注意:列表第一个元素为空,即代表当前目录,所以你自己定义的模块在当前目录会被优先导入。

开源模块安装、使用

https://pypi.python.org/pypi 是 python 的开源模块库,截至2017年9月3日,已经收录了118170个来自全世界python开发者贡献的模块,几乎涵盖了你想用python做的任何事情。事实上每个python开发者,只要注册一个账号就可以往这个平台上传你自己的模块,这样全世界的开发者都可以容易的下载并使用你的模块。

那如何从这个平台上下载代码呢?

  1. 直接在上面这个页面上点 download ,下载后,解压并进入目录,执行以下命令完成安装
编译源码    python  setup.py  build
安装源码    python  setup.py  install

         2.直接通过 pip 安装

pip3  install  paramiko  #parmiko 是模块名

pip命令会自动下载模块包并完成安装。

软件一般会被自动安装到你 python 安装目录的这个子目录里。

/your_python_install_path/3.7/lib/python3.7/site-packages

pip 命令默认会连接在国外的python官方服务器下载,速度比较慢,你还可以使用国内的豆瓣源,数据会定期同步国外官网,速度快好多。

sudo pip install -i http://pypi.douban.com/simple/ alex_sayhi --trusted-host pypi.douban.com  #alex_sayhi是模块

使用

下载后,直接导入使用就可以,跟自带的模块调用方法无差,演示一个连接linux执行命令的模块。

#coding:gbk

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.1.108',22,'alex','123')

stdin, stdout, stderr = ssh.exec_command('df')
print(stdout.read())
ssh.close()

执行命令 - 通过用户名和密码连接服务器