##################################################
目录
Python 中使用 import 或 from-import 导入模块
##################################################
活动简介
活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰;一个人摸索学习很难坚持,想组团高效学习;想写博客但无从下手,急需写作干货注入能量;热爱写作,愿意让自己成为更好的人…
…
欢迎参与CSDN学习挑战赛,成为更好的自己,请参考活动中各位优质专栏博主的免费高质量专栏资源(这部分优质资源是活动限时免费开放喔~),按照自身的学习领域和学习进度学习并记录自己的学习过程,或者按照自己的理解发布专栏学习作品!
##################################################
Python 库包与模块概念及导入使用
——————————
Python 模块
%%%%%
函数、类、模块、包、库 通俗的解释
函数是完成特定功能的一段程序 是可复用程序的最小组成单位
类是包含一组数据及操作这些数据或传递消息的函数的集合
模块是在函数和类的基础上将一系列相关代码组织到一起的集合体
在 Python 中一个模块就是一个扩展名为 .py 的源程序文件!
为了方便调用将一些功能相近的模块组织在一起
或是将一个较为复杂的模块拆分为多个组成部分
可以将这些 .py 源程序文件放在同一个文件夹下按照 Python 的规则进行管理
这样的文件夹和其中的文件就称为包
以 __init__.py 为文件名表示声明该文件夹是一个 Python 包的源程序目录
库则是功能相关联的包的集合
%%%%%
关于 Python 的搜索路径
在导入一个包时 Python 首先在当前包中查找模块
若找不到则在内置的 built-in 模块中查找
仍然找不到的话会根据 sys.path 中的目录来寻找这个包中包含的子目录
目录只有包含 __init__.py 文件时才会被认作是一个包
最简单的就是建立一个内容为空的文件并命名为 __init__.py
事实上 __init__.py 还应定义 __all__ 用来支持模糊导入
可以使用以下语句查看当前系统的 Python 搜索路径:
>>> import sys
>>> sys.path
['', 'D:\\1.Environment\\Python\\Python310\\python310.zip', 'D:\\1.Environment\\
Python\\Python310\\DLLs', 'D:\\1.Environment\\Python\\Python310\\lib', 'D:\\1.En
vironment\\Python\\Python310', 'D:\\1.Environment\\Python\\Python310\\lib\\site-
packages']
>>>
我的结果如下:
D:\\1.Environment\\Python\\Python310\\python310.zip
D:\\1.Environment\\Python\\Python310\\DLLs
D:\\1.Environment\\Python\\Python310\\lib
D:\\1.Environment\\Python\\Python310
D:\\1.Environment\\Python\\Python310\\lib\\site-packages
需要注意的是 Python 安装目录下的 Lib 文件夹内存放了内置的标准库:
D:\1.Environment\Python\Python310\Lib>dir
驱动器 D 中的卷是 Work
卷的序列号是 000D-8D77
D:\1.Environment\Python\Python310\Lib 的目录
2022/08/02 01:52 <DIR> .
2022/08/02 01:52 <DIR> ..
2022/06/06 16:22 6,710 abc.py
2022/06/06 16:22 33,552 aifc.py
2022/06/06 16:22 517 antigravity.py
2022/06/06 16:22 100,725 argparse.py
2022/06/06 16:22 61,273 ast.py
2022/06/06 16:22 11,835 asynchat.py
2022/08/02 01:50 <DIR> asyncio
2022/06/06 16:22 20,917 asyncore.py
2022/06/06 16:22 21,450 base64.py
2022/06/06 16:22 33,114 bdb.py
2022/06/06 16:22 15,286 binhex.py
2022/06/06 16:22 3,245 bisect.py
2022/06/06 16:22 12,191 bz2.py
2022/06/06 16:22 25,334 calendar.py
2022/06/06 16:22 35,103 cgi.py
2022/06/06 16:22 12,417 cgitb.py
2022/06/06 16:22 5,604 chunk.py
2022/06/06 16:22 15,261 cmd.py
2022/06/06 16:22 10,937 code.py
2022/06/06 16:22 37,798 codecs.py
2022/06/06 16:22 5,683 codeop.py
2022/08/02 01:50 <DIR> collections
2022/06/06 16:22 4,182 colorsys.py
2022/06/06 16:22 20,706 compileall.py
2022/08/02 01:50 <DIR> concurrent
2022/06/06 16:22 55,978 configparser.py
2022/06/06 16:22 26,627 contextlib.py
2022/06/06 16:22 133 contextvars.py
2022/06/06 16:22 8,982 copy.py
2022/06/06 16:22 7,645 copyreg.py
2022/06/06 16:22 6,525 cProfile.py
2022/06/06 16:22 3,939 crypt.py
2022/06/06 16:22 16,474 csv.py
2022/08/02 01:50 <DIR> ctypes
2022/08/02 01:50 <DIR> curses
2022/06/06 16:22 57,841 dataclasses.py
2022/06/06 16:22 90,610 datetime.py
2022/08/02 01:50 <DIR> dbm
2022/06/06 16:22 331 decimal.py
2022/06/06 16:22 85,364 difflib.py
2022/06/06 16:22 20,560 dis.py
2022/08/02 01:50 <DIR> distutils
2022/06/06 16:22 107,953 doctest.py
2022/08/02 01:50 <DIR> email
2022/08/02 01:50 <DIR> encodings
2022/08/02 01:50 <DIR> ensurepip
2022/06/06 16:22 40,884 enum.py
2022/06/06 16:22 10,491 filecmp.py
2022/06/06 16:22 16,699 fileinput.py
2022/06/06 16:22 6,912 fnmatch.py
2022/06/06 16:22 28,990 fractions.py
2022/06/06 16:22 36,477 ftplib.py
2022/06/06 16:22 39,068 functools.py
2022/06/06 16:22 5,130 genericpath.py
2022/06/06 16:22 7,704 getopt.py
2022/06/06 16:22 6,175 getpass.py
2022/06/06 16:22 28,054 gettext.py
2022/06/06 16:22 8,125 glob.py
2022/06/06 16:22 9,819 graphlib.py
2022/06/06 16:22 22,458 gzip.py
2022/06/06 16:22 10,498 hashlib.py
2022/06/06 16:22 23,478 heapq.py
2022/06/06 16:22 7,936 hmac.py
2022/08/02 01:50 <DIR> html
2022/08/02 01:50 <DIR> http
2022/08/02 01:52 <DIR> idlelib
2022/06/06 16:22 56,515 imaplib.py
2022/06/06 16:22 3,976 imghdr.py
2022/06/06 16:22 10,937 imp.py
2022/08/02 01:50 <DIR> importlib
2022/06/06 16:22 127,052 inspect.py
2022/06/06 16:22 4,310 io.py
2022/06/06 16:22 77,010 ipaddress.py
2022/08/02 01:50 <DIR> json
2022/06/06 16:22 1,124 keyword.py
2022/08/02 01:50 <DIR> lib2to3
2022/06/06 16:22 5,837 linecache.py
2022/06/06 16:22 79,885 locale.py
2022/08/02 01:50 <DIR> logging
2022/06/06 16:22 13,633 lzma.py
2022/06/06 16:22 80,945 mailbox.py
2022/06/06 16:22 8,429 mailcap.py
2022/06/06 16:22 23,180 mimetypes.py
2022/06/06 16:22 25,086 modulefinder.py
2022/08/02 01:50 <DIR> msilib
2022/08/02 01:50 <DIR> multiprocessing
2022/06/06 16:22 5,890 netrc.py
2022/06/06 16:22 42,113 nntplib.py
2022/06/06 16:22 29,215 ntpath.py
2022/06/06 16:22 2,968 nturl2path.py
2022/06/06 16:22 10,731 numbers.py
2022/06/06 16:22 6,118 opcode.py
2022/06/06 16:22 11,211 operator.py
2022/06/06 16:22 62,050 optparse.py
2022/06/06 16:22 40,636 os.py
2022/06/06 16:22 51,036 pathlib.py
2022/06/06 16:22 64,992 pdb.py
2022/06/06 16:22 66,766 pickle.py
2022/06/06 16:22 96,376 pickletools.py
2022/06/06 16:22 9,161 pipes.py
2022/06/06 16:22 25,291 pkgutil.py
2022/06/06 16:22 43,246 platform.py
2022/06/06 16:22 29,150 plistlib.py
2022/06/06 16:22 15,681 poplib.py
2022/06/06 16:22 16,763 posixpath.py
2022/06/06 16:22 25,114 pprint.py
2022/06/06 16:22 23,481 profile.py
2022/06/06 16:22 30,105 pstats.py
2022/06/06 16:22 5,400 pty.py
2022/06/06 16:22 11,710 pyclbr.py
2022/06/06 16:22 112,431 pydoc.py
2022/08/02 01:50 <DIR> pydoc_data
2022/06/06 16:22 8,049 py_compile.py
2022/06/06 16:22 11,822 queue.py
2022/06/06 16:22 7,510 quopri.py
2022/06/06 16:22 34,151 random.py
2022/06/06 16:22 16,243 re.py
2022/06/06 16:22 5,428 reprlib.py
2022/06/06 16:22 8,036 rlcompleter.py
2022/06/06 16:22 13,432 runpy.py
2022/06/06 16:22 6,518 sched.py
2022/06/06 16:22 2,108 secrets.py
2022/06/06 16:22 20,155 selectors.py
2022/06/06 16:22 8,803 shelve.py
2022/06/06 16:22 13,851 shlex.py
2022/06/06 16:22 54,226 shutil.py
2022/06/06 16:22 2,530 signal.py
2022/08/02 01:52 <DIR> site-packages
2022/06/06 16:22 23,261 site.py
2022/06/06 16:22 36,144 smtpd.py
2022/06/06 16:22 46,558 smtplib.py
2022/06/06 16:22 7,356 sndhdr.py
2022/06/06 16:22 37,693 socket.py
2022/06/06 16:22 28,140 socketserver.py
2022/08/02 01:50 <DIR> sqlite3
2022/06/06 16:22 28,781 sre_compile.py
2022/06/06 16:22 7,438 sre_constants.py
2022/06/06 16:22 41,855 sre_parse.py
2022/06/06 16:22 53,651 ssl.py
2022/06/06 16:22 5,680 stat.py
2022/06/06 16:22 44,332 statistics.py
2022/06/06 16:22 10,846 string.py
2022/06/06 16:22 13,189 stringprep.py
2022/06/06 16:22 272 struct.py
2022/06/06 16:22 85,984 subprocess.py
2022/06/06 16:22 18,684 sunau.py
2022/06/06 16:22 10,520 symtable.py
2022/06/06 16:22 28,412 sysconfig.py
2022/06/06 16:22 11,741 tabnanny.py
2022/06/06 16:22 98,137 tarfile.py
2022/06/06 16:22 23,931 telnetlib.py
2022/06/06 16:22 29,309 tempfile.py
2022/08/02 01:52 <DIR> test
2022/06/06 16:22 20,266 textwrap.py
2022/06/06 16:22 1,031 this.py
2022/06/06 16:22 58,849 threading.py
2022/06/06 16:22 13,871 timeit.py
2022/08/02 01:52 <DIR> tkinter
2022/06/06 16:22 2,523 token.py
2022/06/06 16:22 26,605 tokenize.py
2022/06/06 16:22 29,935 trace.py
2022/06/06 16:22 26,910 traceback.py
2022/06/06 16:22 18,607 tracemalloc.py
2022/06/06 16:22 915 tty.py
2022/06/06 16:22 147,901 turtle.py
2022/08/02 01:52 <DIR> turtledemo
2022/06/06 16:22 10,424 types.py
2022/06/06 16:22 95,164 typing.py
2022/08/02 01:50 <DIR> unittest
2022/08/02 01:50 <DIR> urllib
2022/06/06 16:22 7,165 uu.py
2022/06/06 16:22 28,052 uuid.py
2022/08/02 01:50 <DIR> venv
2022/06/06 16:22 20,237 warnings.py
2022/06/06 16:22 18,517 wave.py
2022/06/06 16:22 22,235 weakref.py
2022/06/06 16:22 24,962 webbrowser.py
2022/08/02 01:50 <DIR> wsgiref
2022/06/06 16:22 6,154 xdrlib.py
2022/08/02 01:50 <DIR> xml
2022/08/02 01:50 <DIR> xmlrpc
2022/06/06 16:22 7,741 zipapp.py
2022/06/06 16:22 91,315 zipfile.py
2022/06/06 16:22 30,913 zipimport.py
2022/08/02 01:50 <DIR> zoneinfo
2022/06/06 16:22 3,359 _aix_support.py
2022/06/06 16:22 2,772 _bootsubprocess.py
2022/06/06 16:22 33,211 _collections_abc.py
2022/06/06 16:22 9,000 _compat_pickle.py
2022/06/06 16:22 5,843 _compression.py
2022/06/06 16:22 15,049 _markupbase.py
2022/06/06 16:22 22,361 _osx_support.py
2022/06/06 16:22 235,086 _pydecimal.py
2022/06/06 16:22 97,185 _pyio.py
2022/06/06 16:22 6,336 _py_abc.py
2022/06/06 16:22 3,231 _sitebuiltins.py
2022/06/06 16:22 25,856 _strptime.py
2022/06/06 16:22 7,462 _threading_local.py
2022/06/06 16:22 6,129 _weakrefset.py
2022/06/06 16:22 5,302 __future__.py
2022/06/06 16:22 65 __phello__.foo.py
2022/08/02 01:54 <DIR> __pycache__
169 个文件 4,740,569 字节
35 个目录 6,143,684,608 可用字节
D:\1.Environment\Python\Python310\Lib>
而 Lib/site-packages 目录下 有的 Linux 发行版是 lib/dist-packages
存放了用户自行安装的第三方 模块/库 :
D:\1.Environment\Python\Python310\Lib>cd site-packages
D:\1.Environment\Python\Python310\Lib\site-packages>dir
驱动器 D 中的卷是 Work
卷的序列号是 000D-8D77
D:\1.Environment\Python\Python310\Lib\site-packages 的目录
2022/08/02 01:52 <DIR> .
2022/08/02 01:52 <DIR> ..
2022/08/02 01:52 152 distutils-precedence.pth
2022/08/02 01:52 <DIR> pip
2022/08/02 01:53 <DIR> pip-22.0.4.dist-info
2022/08/02 01:52 <DIR> pkg_resources
2022/06/06 16:22 121 README.txt
2022/08/02 01:52 <DIR> setuptools
2022/08/02 01:52 <DIR> setuptools-58.1.0.dist-info
2022/08/02 01:52 <DIR> _distutils_hack
2 个文件 273 字节
8 个目录 6,143,684,608 可用字节
D:\1.Environment\Python\Python310\Lib\site-packages>
%%%%%
说一下 sys 中的 sys.path sys.argv
sys.path 包含了 Python 解释器自动查找所需模块的路径的列表
sys.path 列表里的路径分为三种:
第一种是当前执行脚本 是主动执行而不是被其她模块调用的脚本的所在路径 是列表中的第一个元素 若没有执行脚本 则是个空字符串
第二种是 Python 内置的标准库路径 PYTHONPATH
其她的是安装的第三方模块路径
在 Python 启动时 sys.path 根据内建规则和 PYTHONPATH 变量进行初始化
可以进行 append、insert、pop、remove 等各种列表相关的操作
但通常都进行 append 操作
在 PYTHONPATH 环境变量中增加相应的路径
sys.path.append/自定义模块路径 这种方法是运行时修改 脚本运行后就会失效的
sys.argv 获取命令行参数 返回值是 List
列表的第一个元素是脚本名称
第二个元素开始才是真正的参数
示例:
>>> import sys
>>> print ( sys.argv )
['']
>>>
如果 test.py 脚本文件内容如下:
import sys
print ( sys.argv )
执行命令如下:
python3 test.py 521
则输出如下:
['test.py', '521']
%%%%%
dir() 怎么查看可用方法
还可以使用 dir() 查看指定模块中的可用方法!
查看默认输出示例:
C:\Users\byme>python
Python 3.10.5 (tags/v3.10.5:f377153, Jun 6 2022, 16:14:13) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__pack
age__', '__spec__']
>>>
查看 print 中可用的方法:
>>> dir ( print )
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__form
at__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_s
ubclass__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '
__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr
__', '__sizeof__', '__str__', '__subclasshook__', '__text_signature__']
>>>
——————————
Python 包与库概念
包就是存放多个模块的文件夹 其实本质上就是一个目录……
一个大型的项目往往需要使用成百上千的 Python 模块
如果将这些模块都堆放在一起肯定不好管理
而且使用模块可以有效避免变量名或函数名重名引发的冲突
但是如果模块名重复怎么办呢?
因此才有了 包/Package 的概念
什么是包呢?
简单理解 包就是文件夹
只不过在该文件夹下必须存在一个名为
__init__.py
的文件
这对于 Python 2 来说是必须的
而在 Python 3 中有没有 __init__.py 文件对包来说并不是必须的
所以每个包的目录下都必须建立一个
__init__.py
的模块文件 可以是一个空模块 也可以写一些初始化代码 其作用就是告诉 Python 要将该目录当成包来处理
注意 __init__.py 不同于其她模块文件
此模块的模块名不是 __init__ 而是她所在的包名!
例如在 settings 包中的 __init__.py 文件其模块名就是 settings
%%%%%
包概念总结
Python 包:
包是一个包含多个模块的文件夹
她的本质依然是模块
因此包中也可以包含包
例如 我们安装了 numpy 模块之后可以在 Lib\site-packages 安装目录下找到名为 numpy 的文件夹
她就是安装的 numpy 模块 其实就是一个包
%%%%%
库概念总结
Python 库:
相比模块和包来说库是一个更大的概念
例如在 Python 标准库中的每个库都有好多个包 而每个包中都有若干个模块
——————————
Python 中使用 import 或 from-import 导入模块
import 与 from-import 用法
在 Python 中使用
import
from-import
来导入相应模块
%%%%%
导入整个模块
将整个 somemodule/模块 导入:
import 模块
示例:
>>> import sys
>>>
或者这样将某个模块中的函数全部导入:
from 模块 import *
%%%%%
只希望导入模块中指定的一部分
从某个模块中导入 somefunction/某个函数 格式如下:
from 模块 import 函数
示例:
>>> import sys # 之前导入 sys 过了
>>> dir(sys) # 查看 sys 模块可用的方法函数
['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__', '__intera
ctivehook__', '__loader__', '__name__', '__package__', '__spec__', '__stderr__',
'__stdin__', '__stdout__', '__unraisablehook__', '_base_executable', '_clear_ty
pe_cache', '_current_exceptions', '_current_frames', '_deactivate_opcache', '_de
bugmallocstats', '_enablelegacywindowsfsencoding', '_framework', '_getframe', '_
git', '_home', '_xoptions', 'addaudithook', 'api_version', 'argv', 'audit', 'bas
e_exec_prefix', 'base_prefix', 'breakpointhook', 'builtin_module_names', 'byteor
der', 'call_tracing', 'copyright', 'displayhook', 'dllhandle', 'dont_write_bytec
ode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'f
loat_info', 'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_trac
king_depth', 'getallocatedblocks', 'getdefaultencoding', 'getfilesystemencodeerr
ors', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount',
'getsizeof', 'getswitchinterval', 'gettrace', 'getwindowsversion', 'hash_info',
'hexversion', 'implementation', 'int_info', 'intern', 'is_finalizing', 'last_tr
aceback', 'last_type', 'last_value', 'maxsize', 'maxunicode', 'meta_path', 'modu
les', 'orig_argv', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'pla
tlibdir', 'prefix', 'ps1', 'ps2', 'pycache_prefix', 'set_asyncgen_hooks', 'set_c
oroutine_origin_tracking_depth', 'setprofile', 'setrecursionlimit', 'setswitchin
terval', 'settrace', 'stderr', 'stdin', 'stdlib_module_names', 'stdout', 'thread
_info', 'unraisablehook', 'version', 'version_info', 'warnoptions', 'winver']
>>> from sys import __doc__ # 从 sys 模块中单独导入 __doc__ 函数
>>>
%%%%%
还可以根据类名函数名导入
语法如下:
from 包或模块名 import 包或类或函数名_1, 包或类或函数名_2 , 包或类或函数名_N
%%%%%
从某个模块中导入多个函数
还可以导入多个函数 语法如下:
from 模块 import 函数_1, 函数_2, 函数_3, 函数_N
%%%%%
使用 as 为包名设置一个简称
为什么需要简称 主要是为了容易区分
语法如下:
import 包名 as 简称
%%%%%
关于初始化调用模块可执行代码
模块除了方法定义 一般还可以包括用来初始化这个模块可执行的代码
她们只在第一次被导入时才会被执行
一个模块被另一个程序第一次引入时 其主程序将运行
若希望引入模块时其中的某些程序块不执行 可以借助 __name__ 属性使这些程序块仅在该模块自身运行时执行!
示例:
if __name__ == '__main__':
print ( "程序自身在运行" )
else:
print ( "以模块方式运行" )
测试结果如下:
>>> if __name__ == '__main__':
... print ( "程序自身在运行" )
... else:
... print ( "以模块方式运行" )
...
程序自身在运行
>>>