python sys的使用

sys是python中较为常用的一个模块,他提供了对python脚本运行时的环境的操作。sys让我们能够访问与python解释器联系紧密的函数和变量。

1、sys.argv #将python脚本运行时的脚本名以及参数作为一个list,并输出。

 1 # -*- coding: utf-8 -*-
 2 """
 3 Created on Fri Jan  5 23:24:34 2018
 4 自定义文件库命名,然后转出
 5 @author: BruceWong
 6 """
 7 
 8 import os
 9 import sys
10 print(sys.argv)
11 print('the script name is:',sys.argv[0])
12 if len(sys.argv) > 1:
13     print("there are", len(sys.argv)-1, "arguments:")  # 使用len(sys.argv)-1采集参数个数-1为减去[0]脚本名称
14     for arg in sys.argv[1:]:            #输出除了[0]外所有参数
15         print(arg)
16 else:
17     print("there are no arguments!")
18 '''
19 the script name is: C:/Users/BruceWong/.spyder-py3/selfdone/自定义文件库命名.py
20 there are no arguments!
21 '''



如果直接在ipython或者spyder的编译器下运行,会反应编译器的脚本环境:

1 In [1]: import sys
2 In [2]: sys.argv
3 Out[2]: ['C:/Anaconda3/Scripts/ipython-script.py']



接下来还是在一个脚本下运行,来进一步测试sys的功能;

2 、sys.path #返回一个list,该list为当前脚本的path环境变量(PYTHONPATH)

print(sys.path)
'''
['', 'C:\\Anaconda3\\lib\\site-packages\\spyder\\utils\\site', 'C:\\Anaconda3\\python35.zip', 'C:\\Anaconda3\\DLLs', 'C:\\Anaconda3\\lib', 'C:\\Anaconda3', 'C:\\Anaconda3\\lib\\site-packages', 'C:\\Anaconda3\\lib\\site-packages\\Mako-1.0.7-py3.5.egg', 'C:\\Anaconda3\\lib\\site-packages\\Sphinx-1.4.6-py3.5.egg', 'C:\\Wind\\Wind.NET.Client\\WindNET\\x64', 'C:\\Anaconda3\\lib\\site-packages\\xgboost-0.7-py3.5.egg', 'C:\\Anaconda3\\lib\\site-packages\\win32', 'C:\\Anaconda3\\lib\\site-packages\\win32\\lib', 'C:\\Anaconda3\\lib\\site-packages\\Pythonwin', 'C:\\Anaconda3\\lib\\site-packages\\setuptools-27.2.0-py3.5.egg', 'C:\\Anaconda3\\lib\\site-packages\\IPython\\extensions', 'C:\\Users\\BruceWong\\.ipython']
'''

如果我们要增加或者删除pythonpath的话,使用list的insert或者pop功能即可。

3、sys.platform #返回当前平台

In [3]: print(sys.platform)
win32

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

1 saveout = sys.stdout        # 终在重定向前保存stdout,这样的话之后你还可以将其设回正常
2 fsock = open('out.log', 'w')      # 打开一个新文件用于写入。如果文件不存在,将会被创建。如果文件存在,将被覆盖。
3 sys.stdout = fsock                 # 所有后续的输出都会被重定向到刚才打开的新文件上。
4 
5 print('This message will be logged instead of displayed')    # 这样只会将输出结果“打印”到日志文件中;屏幕上不会看到输出
6 
7 sys.stdout = saveout   # 在我们将 stdout 搞乱之前,让我们把它设回原来的方式。    
8 
9 fsock.close()     # 关闭日志文件。


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

1 print(sys.modules.keys())
2 print(sys.modules.values())
3 print(sys.modules["os"])
4 #<module 'os' from 'C:\\Anaconda3\\lib\\os.py'>


6、sys.exit(n) 执行到主程序末尾,解释器自动退出,但是如果需要中途退出程序,可以调用sys.exit函数,带有一个可选的整数参数返回给调用它的程序,表示你可以在主程序中捕获对sys.exit的调用。(0是正常退出,其他为异常)

 1 In [5]: import sys
 2    ...:
 3    ...: def exitfunc(value):
 4    ...:     print(value)
 5    ...:     sys.exit(0)
 6    ...:
 7    ...: print("hello")
 8    ...:
 9    ...: try:
10    ...:     sys.exit(1)
11    ...: except SystemExit or value:
12    ...:     exitfunc(value)
13    ...:
14    ...:
15    ...: print("come?")
16    ...:
17    ...:
18    ...:
19 hello
20 ---------------------------------------------------------------------------
21 SystemExit                                Traceback (most recent call last)
22 <ipython-input-5-d8e0c0f13067> in <module>()
23       9 try:
24 ---> 10     sys.exit(1)
25      11 except SystemExit or value:
26 
27 SystemExit: 1





7、完整版参考:

  1 #!/usr/bin/env python
  2 # coding=utf-8
  3 __author__ = 'Luzhuo'
  4 __date__ = '2017/5/8'
  5 # sys_demo.py sys解释器相关函数
  6 # 该模块含有解释器的一些变量,与解释器交互的函数
  7 
  8 
  9 import sys
 10 
 11 
 12 def sys_demo():
 13     # 默认编码
 14     print(sys.getdefaultencoding())
 15 
 16     # Python版本
 17     print(sys.version)
 18 
 19     # 添加模块路径到搜索路径
 20     sys.path.append("./module")
 21 
 22     # (函数)打印异常信息
 23     try:
 24         1 / 0
 25     except:
 26         types, value, back = sys.exc_info()  # 捕获异常
 27         sys.excepthook(types, value, back)  # 打印异常
 28 
 29     # 输入和输出
 30     sys.stdout.write(">> ")
 31     sys.stdout.flush()
 32     strs = sys.stdin.readline()[:-1]
 33     sys.stderr.write("输入的内容为: {}".format(strs))
 34     sys.stderr.flush()
 35 
 36 
 37 def sys_func():
 38     lists = sys.argv  # 传递给Python脚本的命令行参数列表 => python p.py -> ['p.py'] / python p.py a 1 -> ['p.py', 'a', '1'] / 程序内执行 -> ['']
 39     strs = sys.getdefaultencoding()  # 默认字符集名称
 40     strs = sys.getfilesystemencoding()  # 系统文件名字符集名称
 41     num = sys.getrefcount(object)  # 返回object的引用计数(比实际多1个)
 42     dicts = sys.modules  # 已加载的模块, 可修改, 但不能通过修改返回的字典进行修改
 43     lists = sys.path  # 模块搜索路径
 44     sys.path.append("./test")  # 动态添加模块搜索路径
 45     strs = sys.platform  # 平台标识符(系统身份进行详细的检查,推荐使用) Linux:'linux' / Windows:'win32' / Cygwin:'cygwin' / Mac OS X:'darwin'
 46     strs = sys.version  # python解释器版本
 47     lists = sys.thread_info  # 线程信息
 48     num = sys.api_version  # 解释器C API版本
 49 
 50     types, value, back = sys.exc_info()  # 捕获异常 详见 异常 文章的 excep() 代码块第二小部分(http://blog.csdn.net/rozol/article/details/69313164)
 51     sys.excepthook(types, value, back)  # 打印异常
 52     types = sys.last_type
 53     value = sys.last_value
 54     back = sys.last_traceback
 55     # sys.exit([arg]) // 引发SystemExit异常退出Python(可以try), 范围[0,127], None==0, "string"==1
 56     sys.exit(0)
 57 
 58     num = sys.getrecursionlimit()  # 最大递归数(堆栈最大深度), 详见 函数 文章(http://blog.csdn.net/rozol/article/details/69242050)
 59     sys.setrecursionlimit(5000)  # 修改最大递归数
 60 
 61     fnum = sys.getswitchinterval()  # 获取线程切换间隔
 62     sys.setswitchinterval(0.005)  # 设置线程切换间隔, 单位秒
 63     num = sys.getcheckinterval()  # 解释器的检查间隔
 64     sys.setcheckinterval(100)  # 设置解释器检查间隔, 执行(默认)100个虚拟指令执行一次检查, 值为<=0时,检查每个虚拟指令
 65 
 66     # sys.stdin // 标准输入流
 67     strs = sys.stdin.readline()[:-1]
 68     # sys.stdout // 标准出入输出
 69     sys.stdout.write(">>")
 70     sys.stdout.flush()
 71     # sys.stderr // 标注错误流
 72     sys.stderr.write(">>")
 73 
 74     # ---
 75 
 76     lists = sys.builtin_module_names  # 所有模块 (注:非导入模块)
 77     path = sys.base_exec_prefix  # Python安装路径
 78     path = sys.base_prefix  # 同base_exec_prefix
 79     path = sys.exec_prefix  # 同base_exec_prefix
 80     path = sys.prefix  # 同base_exec_prefix
 81     path = sys.executable  # Python解释器的绝对路径
 82 
 83     strs = ys.byteorder  # 本机字节顺序指示器, big-endian(最高有效字节在第一位)值为'big', little-endian(最低有效字节在第一位)值为'little'
 84     strs = sys.copyright  # python版权
 85     num = sys.hexversion  # 16进制版本号
 86     lists = sys.implementation  # 当前运行的解释器的信息
 87     num = sys.getallocatedblocks()  # 解释器当前分配的内存块的数量
 88     boolean = sys.dont_write_bytecode  # 是否不会尝试导入源模块是写入.pyc文件 (False会写入.pyc文件)
 89     # sys.getsizeof(object[, default]) // 返回对象的大小bit, 只计算自身内存消耗,不计算引用对象的内存消耗, 调用对象的__sizeof__(), default没有获取到默认返回值
 90     num = sys.getsizeof(object)
 91     boolean = sys.is_finalizing()  # 解释器是否正在被关机
 92     num = sys.maxsize  # 最大整数值(2 ** 31 -1), 与系统有关
 93     num = sys.maxunicode  # 最大Unicode值的整数 (1114111)
 94     strs = sys.ps1  # 解释器主提示符
 95     strs = sys.ps2  # 解释器次提示符
 96 
 97     sys.call_tracing(func, ("arg",))  # 调用函数
 98     sys._clear_type_cache()  # 清除内部类型缓存
 99     sys._debugmallocstats()  # 打印CPython内存分配器状态的低级信息
100 
101     sys.setprofile(profilefunc)  # 设置profile函数, 默认None
102     sys.getprofile()  # 获取profile函数
103     sys.settrace(tracefunc)  # 设置跟踪函数, def tracefunc(frame、event 和arg):
104     sys.gettrace()  # 获取跟踪函数, 默认None
105     sys.set_coroutine_wrapper(wrapper)  # 设置包装 def wrapper(coro):
106     sys.get_coroutine_wrapper()  # 包装, 默认None
107 
108 
109 if __name__ == "__main__":
110     sys_demo()
111 
112     # sys_func()

猜你喜欢

转载自www.cnblogs.com/moying-wq/p/10011439.html