欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python3 模块

程序员文章站 2022-06-12 22:47:58
...

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

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

[[email protected] ~]# vim 1.py    
#!/usr/bin/env python

import sys

print('命令行参数:')
for i in sys.argv:
    print(i)

print('\n Python 的路径为:',sys.path,'\n')
结果

[[email protected] ~]# ./1.py v1 v2
命令行参数:
./1.py
v1
v2

 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语句,如果模块在当前的搜索路径就会被导入。搜索路径是一个解释器会进行搜索的所有目录的列表。例子


[[email protected] ~]# vim fun1.py
#!/usr/bin/env python

def print_f(s):
    print(s)
    return

def print_f2(s):
    print('print_f2',s)
    return

另一个文件

[[email protected] ~]# vim 1.py
#!/usr/bin/env python

#导入模块
import fun1

#调用
fun1.print_f('hello china')
结果
[[email protected] ~]# ./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 python

if __name__=='__main__':
    print('程序自身在运行')
  se:
▽   print('来自另一个模块')

[[email protected] ~]# ./fun3.py 
程序自身在运行
[[email protected] ~]# python
Python 3.6.0 (default, Apr  2 2017, 17:16:19) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type "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"]