sys模块

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

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

sys模块是与python解释器交互的一个接口, sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。

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

1
2
3
>>> 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 列表的第一个参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import sys
print(sys.argv[0]) #sys.argv[0]表示代码本身的文件路径
print("命令行参数如下:")
for i in sys.argv:
print(i)

命令行:
D:\st13\python\1.20\lx.py Welcome to Xian

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

2、sys.path

获取指定模块搜索路径的目录名列表,列表中的第一项为当前的工作目录。跟linux中的PATH变量一样的,如果想直接执行命令,必须放在PATH提供的路径或自己添加一个路径进去。这里主要是import导入的时候就是从这里面去找对就的模块名在不在这里面,没有就不能导入。

1
2
3
4
5
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”) 语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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版本的信息。

1
2
3
>>> 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 — 获取当前的系统平台,返回操作系统的名称。

1
2
3
>>> import sys
>>> sys.platform
'win32'

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

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

1
2
3
4
5
6
7
8
9
10
11
>>>import sys
#返回系统导入的模块字段
>>> sys.modules['os']
<module 'os' from 'C:\\Python36\\lib\\os.py'>
#返回所有已经导入的模块列表
>>> 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([<module 'builtins' (built-in)>, <module 'sys' (built-in)>, <module 'importlib._bootstrap' (frozen)>, <module '_imp' (built-in)>, <module '_warnings' (built-in)>, <module '_thread' (built-in)>, <module '_weakref' (built-in)>, <module 'importlib._bootstrap_external' (frozen)>, <module 'io' (built-in)>, <module 'marshal' (built-in)>, <module 'nt' (built-in)>, <module 'winreg' (built-in)>, <module 'zipimport' (built-in)>, <module 'encodings' from 'C:\\Python36\\lib\\encodings\\__init__.py'>, <module 'codecs' from 'C:\\Python36\\lib\\codecs.py'>, <module '_codecs' (built-in)>, <module 'encodings.aliases' from 'C:\\Python36\\lib\\encodings\\aliases.py'>, <module
'encodings.utf_8' from 'C:\\Python36\\lib\\encodings\\utf_8.py'>, <module '_signal' (built-in)>, <module '__main__' (built-in)>, <module 'encodings.latin_1' from 'C:\\Python36\\lib\\encodings\\latin_1.py'>, <module 'io' from 'C:\\Python36\\lib\\io.py'>, <module 'abc' from 'C:\\Python36\\lib\\abc.py'>, <module '_weakrefset' from 'C:\\Python36\\lib\\_weakrefset.py'>, <module 'site' from 'C:\\Python36\\lib\\site.py'>, <module 'os' from 'C:\\Python36\\lib\\os.py'>, <module 'errno' (built-in)>, <module 'stat' from 'C:\\Python36\\lib\\stat.py'>, <module '_stat' (built-in)>, <module 'ntpath' from 'C:\\Python36\\lib\\ntpath.py'>, <module 'genericpath' from 'C:\\Python36\\lib\\genericpath.py'>, <module 'ntpath' from 'C:\\Python36\\lib\\ntpath.py'>, <module '_collections_abc' from 'C:\\Python36\\lib\\_collections_abc.py'>, <module '_sitebuiltins' from 'C:\\Python36\\lib\\_sitebuiltins.py'>, <module 'sysconfig' from 'C:\\Python36\\lib\\sysconfig.py'>, <module '_bootlocale' from 'C:\\Python36\\lib\\_bootlocale.py'>, <module '_locale' (built-in)>, <module 'encodings.gbk' from 'C:\\Python36\\lib\\encodings\\gbk.py'>, <module '_codecs_cn' (built-in)>, <module '_multibytecodec' (built-in)>, <module 'types' from 'C:\\Python36\\lib\\types.py'>, <module 'functools' from 'C:\\Python36\\lib\\functools.py'>, <module '_functools' (built-in)>, <module 'collections' from 'C:\\Python36\\lib\\collections\\__init__.py'>, <module 'operator' from 'C:\\Python36\\lib\\operator.py'>, <module '_operator' (built-in)>, <module 'keyword' from 'C:\\Python36\\lib\\keyword.py'>, <module 'heapq' from 'C:\\Python36\\lib\\heapq.py'>, <module '_heapq' (built-in)>, <module 'itertools' (built-in)>, <module 'reprlib' from 'C:\\Python36\\lib\\reprlib.py'>, <module '_collections' (built-in)>, <module 'weakref' from 'C:\\Python36\\lib\\weakref.py'>, <module 'collections.abc' from 'C:\\Python36\\lib\\collections\\abc.py'>, <module 'importlib' from 'C:\\Python36\\lib\\importlib\\__init__.py'>, <module 'importlib._bootstrap' (frozen)>, <module 'importlib._bootstrap_external' (frozen)>, <module 'warnings' from 'C:\\Python36\\lib\\warnings.py'>, <module 'importlib.util' from 'C:\\Python36\\lib\\importlib\\util.py'>, <module 'importlib.abc' from 'C:\\Python36\\lib\\importlib\\abc.py'>, <module 'importlib.machinery' from 'C:\\Python36\\lib\\importlib\\machinery.py'>, <module 'contextlib' from 'C:\\Python36\\lib\\contextlib.py'>, <module 'zope' (namespace)>, <module 'atexit' (built-in)>])

7、sys.stdout、sys.stdin、sys.stderr

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

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

1
2
3
4
5
6
7
>>> import sys
>>> sys.stdin
<_io.TextIOWrapper name='<stdin>' mode='r' encoding='utf-8'>
>>> sys.stdout
<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>
>>> sys.stderr
<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf-8'>

8、sys.getdefaultencoding() 、 sys.getfilesystemencoding()

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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]))