Python3 模块
在我们引用变量或者调用函数的时候,这些对象要存在;我们可以将定义的变量或者函数放在文件中,这个文件就叫模块;模块式一个包含定义函数和变量的文件,后缀是;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"]
上一篇: C#接口在派生类和外部类中的调用方法示例
下一篇: sklearn如何获得model里的参数