Python基础(19)——sys模块的使用详解

一、sys模块概述

Python 的 sys 模块提供访问解释器使用或维护的变量,和与解释器进行交互的函数。通俗来讲,sys 模块为程序与 Python 解释器的交互,提供了一系列的函数和变量,用于操控 Python 运行时的环境。

sys 模块是 Python 中内置的模块,所以不需要再单独安装,只需在使用前 import sys 即可。

我们可以通过 dir() 方法查看模块中可用的方法。结果如下:

>>> import sys
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', 
'_clear_type_cache', '_current_frames', '_debugmallocstats', '_enablelegacywindowsfsencoding', '_getframe', '_git', '_home', '_xoptions', 'api_version', 
'argv', 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 
'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', 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit',
'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'getwindowsversion', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'is_finalizing', 
'last_traceback', 'last_type', 'last_value', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 
'ps2', 'set_asyncgen_hooks', 'set_coroutine_wrapper', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info', 'version', 'version_info', 'warnoptions', 'winver']

二、sys模块的常见用法

1、sys.argv — 实现从程序外部向程序传递参数

        sys.argv 变量是一个包含了命令行参数的字符串列表,利用命令行向程序传递参数。其中,脚本的名称总是 sys.argv 列表的第一个参数。

import sys
print(sys.argv[0])   #sys.argv[0]表示代码本身的文件路径
print("命令行参数如下:")
for i in sys.argv:
    print(i)

命令行输入参数如下:
D:\st13\python\1.20\python lx.py Welcome to Xian

运行结果:
lx.py                #sys.argv[0]
命令行参数如下:
lx.py
Welcome
to
Xian

2、sys.path

获取指定模块搜索路径的目录名列表,列表中的第一项为当前的工作目录。

import sys
print(sys.path)

运行结果:
['D:\\st13\\python\\1.20', 'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 
'C:\\Python36\\lib', 'C:\\Python36', 'C:\\Python36\\lib\\site-packages']

3、sys.exit([arg])

        一般情况下执行到主程序末尾,解释器自动退出,但是如果需要中途退出程序,可以调用 sys.exit() 函数,带有一个可选的整数参数返回给调用它的程序,表示你可以在主程序中捕获对 sys.exit() 的调用。(0是正常退出,其他为异常)当然也可以用字符串参数,表示错误不成功的报错信息。

下面的例子,首先打印 'Hello',执行完 sys.exit(1),执行 except 语句,将 '中途退出' 作为参数传递给函数 exitfunc(),然后将 '中途退出' 打印出来,程序正常退出,不执行后面的 print("Welcome") 语句。

import sys
def exitfunc(value):
    print(value)
    sys.exit(0)
print("Hello")
try:
    sys.exit(1)
except SystemExit as value:
    exitfunc('中途退出')   
print("Welcome")

运行结果:
Hello
中途退出

4、sys.version — 获取Python版本的信息。

>>> import sys
>>> sys.version
'3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]'

5、sys.platform — 获取当前的系统平台,返回操作系统的名称。

>>> import sys
>>> sys.platform
'win32'

6、sys.getsizeof() — 获取所查询内容的空间大小。

由下面例子可以推出:对于同一元素,内存空间大小排序为 数字 = 元组 < 字符串 < 列表 < 集合。

>>> import sys
>>> number1=5
>>> str1='5'
>>> tup1=(5)
>>> list1=[5]
>>> set1={5}

>>> sys.getsizeof(number1)
28
>>> sys.getsizeof(str1)
50
>>> sys.getsizeof(tup1)
28
>>> sys.getsizeof(list1)
72
>>> sys.getsizeof(set1)
224

7、sys.modules、sys.modules.keys()、sys.modules.values()

   sys.modules 是一个全局字典,该字典是 Python 启动后就加载在内存中。每当程序员导入新的模块,sys.modules 将自动记录该模块。当第二次再导入该模块时,Python 会直接到字典中查找,从而加快了程序运行的速度。它拥有字典所拥有的一切方法。

>>>import sys
#返回系统导入的模块字段
>>> sys.modules['os']

#返回所有已经导入的模块列表
>>> sys.modules.keys()
dict_keys(['builtins', 'sys', '_frozen_importlib', '_imp', '_warnings', '_thread','_weakref', '_frozen_importlib_external', '_io', 'marshal','nt','winreg','zipimport', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', 'io', 'abc', '_weakrefset', 'site', 'os', 'errno', 'stat', '_stat', 'ntpath', 'genericpath','os.path', '_collections_abc', '_sitebuiltins', 'sysconfig', '_bootlocale', '_locale', 'encodings.gbk', '_codecs_cn', '_multibytecodec', 'types', 'functools', '_functools', 'collections', 'operator', '_operator', 'keyword', 'heapq', '_heapq', 'itertools', 'reprlib', '_collections', 'weakref', 'collections.abc', 'importlib','importlib._bootstrap', 'importlib._bootstrap_external', 'warnings','importlib.util','importlib.abc', 'importlib.machinery', 'contextlib', 'zope','atexit'])
#返回所有的模块,包块模块的路径
>>> sys.modules.values()
dict_values([, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ])

8、sys.stdout、sys.stdin、sys.stderr

sys.stdin:标准输入;stdout:标准输出;stderr:错误输出

stdin,stdout 以及 stderr 变量包含与标准I/O 流对应的流对象。如果需要更好地控制输出,而 print 不能满足你的要求,它们就是你所需要的。你也可以替换它们,这时候你就可以重定向输出和输入到其它设备( device ), 或者以非标准的方式处理它们。

>>> import sys
>>> sys.stdin
<_io.TextIOWrapper name='' mode='r' encoding='utf-8'>
>>> sys.stdout
<_io.TextIOWrapper name='' mode='w' encoding='utf-8'>
>>> sys.stderr
<_io.TextIOWrapper name='' mode='w' encoding='utf-8'>

9、sys.getdefaultencoding() 、  sys.getfilesystemencoding()

  • sys.getdefaultencoding() : 获取解释器默认编码。
  • sys.getfilesystemencoding() :获取内存数据存到文件里的默认编码。
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>> sys.getfilesystemencoding()
'utf-8'

二、sys模块的应用

在下面的例子中,应用了 sys 模块中的 argv 实现了从程序外部向程序传递函数,以此来实现不同参数个数的 ping 命令。

import os
#import sys   这种方法导入sys模块,需使用sys.argv
from sys import argv  #这种方法导入sys模块,可直接使用argv
def ping(net,start=1,end=85,n=1,w=3):
    for i in range(start,end+1):
        ip=net+"."+str(i)
        command="ping %s -n %d -w %d"%(ip,n,w)
        print(ip,("通","不通")[os.system(command)])  #os.system(command):运行command命令
if len(argv) not in [2,4,6]:
    print("参数输入错误!")
    print("运行示例:")
    print("note1.py 121.194.14")
    print("note1.py 121.194.14 80 90")
    print("note1.py 121.194.14 80 90 3 1")
    print("语法:note1.py net startip endip count timeout")
elif len(argv)==2:
    net=argv[1]
    ping(net)
elif len(argv)==4:
    net=argv[1]
    ping(net,start=int(argv[2]),end=int(argv[3]))
else:
    net=argv[1]
    ping(net,start=int(argv[2]),end=int(argv[3]),n=int(argv[4]),w=int(argv[5]))

 

你可能感兴趣的:(Python)