Python3 模块

来源:互联网 发布:白人帅哥 知乎 编辑:程序博客网 时间:2024/06/04 18:27

在我们引用变量或者调用函数的时候,这些对象要存在;我们可以将定义的变量或者函数放在文件中,这个文件就叫模块;模块式一个包含定义函数和变量的文件,后缀是;py

模块可以被别的程序引入,以使用该模块中的函数等功能;标准库也是这样使用的,例如

[root@centos7 ~]# vim 1.py    #!/usr/bin/env pythonimport sysprint('命令行参数:')for i in sys.argv:    print(i)print('\n Python 的路径为:',sys.path,'\n')
结果

[root@centos7 ~]# ./1.py v1 v2命令行参数:./1.pyv1v2 Python 的路径为: ['/root', '/usr/local/python36/lib/python36.zip', '/usr/local/python36/lib/python3.6', '/usr/local/python36/lib/python3.6/lib-dynload', '/usr/local/python36/lib/python3.6/site-packages'] 
import sys引入python标准库中的sys.py模块

sys.argv是一个包含命令行参数的列表

sys.path包含了一个Python解释器自动查找所需模块的路径的列表

import语句

想使用Python源文件,只需在另一个源文件里执行import语句

import module1 [,module2....]
当解释器遇到import语句,如果模块在当前的搜索路径就会被导入。搜索路径是一个解释器会进行搜索的所有目录的列表。例子


[root@centos7 ~]# vim fun1.py#!/usr/bin/env pythondef print_f(s):    print(s)    returndef print_f2(s):    print('print_f2',s)    return

另一个文件

[root@centos7 ~]# vim 1.py#!/usr/bin/env python#导入模块import fun1#调用fun1.print_f('hello china')
结果
[root@centos7 ~]# ./1.py hello china
一个模块只会被倒入一次

使用import时候,python解释器是怎么找到对应的文件?搜索路径,它是一系列目录名组成的,Python解释器以此从这些目录中找引入的模块

搜索路径是Python编译或者安装的时候确定的,安装新的库应该也会修改,搜索路径被存储在sys模块中的path变量,做一个测试,在交互shell中查看:

>>> import sys>>> sys.path['', '/usr/local/python36/lib/python36.zip', '/usr/local/python36/lib/python3.6', '/usr/local/python36/lib/python3.6/lib-dynload', '/usr/local/python36/lib/python3.6/site-packages']
sys.path输出是一个列表,第一项是空串‘’,代表当前目录(如果是从一个脚本执行的时候,清楚的看到路径,比如上面实验是哦那个的/root),也就是我们执行python解释器的目录。这样,我们就可以在sys。path中或者当前目录中定义一些模块,比如上边的func1.py,但后执行import引入。


from...import语句

python的from语句让你从模块中倒入一个指定部分到当前命名空间中。

from modname import name1[, name2[, ... nameN]]

例如,
>>> from fun1 import print_f>>> print_f('hello')hello
这样可以导入指定函数

from...import*语句

导入模块的所有内容

from modname import *

_name_属性

一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想再模块被引入时,模块的某一程序快不执行,可以使用__name__

#!/usr/bin/env pythonif __name__=='__main__':    print('程序自身在运行')  se:▽   print('来自另一个模块')

[root@centos7 ~]# ./fun3.py 程序自身在运行
[root@centos7 ~]# pythonPython 3.6.0 (default, Apr  2 2017, 17:16:19) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linuxType "help", "copyright", "credits" or "license" for more information.>>> import fun3来自另一个模块
说明:每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入

dir()函数

那只的dir(0可以找到模块内定义的所有名称,以一个字符串列表的形式返回

>>> import sys>>> dir(sys)['__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe', '_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_wrapper', 'getallocatedblocks', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'is_finalizing', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'set_asyncgen_hooks', 'set_coroutine_wrapper', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info', 'version', 'version_info', 'warnoptions']>>> import fun3来自另一个模块>>> dir(fun3)['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']>>> 
如果没有指定参数,dir() 函数会罗列出当前定义的所有名称
>>> dir()['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']>>> abc = 123>>> d=45  >>> dir<built-in function dir>>>> dir()['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'abc', 'd']>>> 

标准模板

python本身带着一些标准的模板库,有些模板直接被构建在解析器里。有一个特别的模块 sys ,它内置在每一个 Python 解析器中,变量 sys.ps1 和 sys.ps2 定义了主提示符和副提示符所对应的字符串:

>>> import sys>>> sys.ps1'>>> '>>> sys.ps2'... '>>> sys.ps1='>>>>>   '>>>>>   print('hello')hello

包是一种惯例Python模块命名空间的形式,采用---点模块名称

例如一个模块的名字是P.M,代表一个包P中的子模块M;其中一个有点是不同模块可以重名

mypack/       __init__.py  #初始化mypack包       submodule1/            __init__.py            func1.py            func2.py       submodule2/    #子包2            __init__.py            func3.py            func4.py

导入一个包里特定模块

import mypack.submodule2.func3

这样使用的时候需要使用全名:mypack.submodule2.func3()

另一种倒入方法

from mypack.submodule2  import func3

此种方法不需要使用全名访问:func3()

从一个包中倒入*

在linux平台frommypack.submodule2 import * 将倒入所有子模块,但是Windows平台上工作的就不是非常好,因为Windows是一个大小写不区分的系统

所以解决方法是在包的init定义中有个__all__变量,定义所有倒入的模块

比如__all__ = ["fun3","fun4"]



0 0
原创粉丝点击