Python3---标准库sys
sys
该文章说明了sys库当中提供的方法分类,以及举例常见的一些方法的使用
2020-02-08
天象独行
Python的sys模块提供访问由解释器使用或维护的变量的接口,并提供了一些函数用来和解释器进行交互,操控Python的运行时环境。
下面我们来举例看看:
- sys.argv
sys.argv可以认为是一个变量或者一个列表。它的作用就是接收“命令行参数”。即接收参数给程序。举个例子,我们常用的验证网络是否正常的命令'ping'。可以在后面添加诸如“-t” 等字符。这里的“-t”字符就是命令行参数。而sys.argv的作用就是将“-t”参数告诉程序。
举例:
我们先采用如下代码来测验:
import sys
a = sys.argv[0] #[0]表示程序本身输入为程序本身,[1]表示
print(a)
我们运行一下该程序,我们发现输出结果为test.py,即程序本身。
c:\Users\aaron\Desktop\Pytoon-cade\venv\Scripts>test.py
test.py
现在我们修改一下该程序,将sys.argv[0]修改为sys.argv[1]。我们还是直接运行不加任何命令行参数。我们发现程序无法运行。这里我理解为在sys.argv[1]的位置没有任何参数,需要我们从程序外输入参数,才导致错误。
c:\Users\aaron\Desktop\Pytoon-cade\venv\Scripts>test.py
Traceback (most recent call last):
File "C:\Users\aaron\Desktop\Pytoon-cade\venv\Scripts\test.py", line 2, in <module>
a = sys.argv[1]
IndexError: list index out of range
那么,我们来尝试添加一个参数。我们发现我们输入的参数被print输出了。换句话说sys.argv[1]接收了‘ssss’参数。
c:\Users\aaron\Desktop\Pytoon-cade\venv\Scripts>test.py ssss
ssss
下面我们输入两个参数,发现程序只接收了一个参数。那么如果我们需要多参数传入该怎么办呢?我们接下来看。
c:\Users\aaron\Desktop\Pytoon-cade\venv\Scripts>test.py ssss dddd
ssss
我们将sys.argv[1]调整为sys.argv[1:]
c:\Users\aaron\Desktop\Pytoon-cade\venv\Scripts>test.py ssss dddd
['ssss', 'dddd']
看起来成功了。这样看来sys.argv更加像一个列表了。
- sys.exit()
执行该语句会直接退出程序,这也是经常使用的方法,也不需要考虑平台等因素的影响,一般是退出Python程序的首选方法。退出程序引发SystemExit异常,(这是唯一一个不会被认为是错误的异常), 如果没有捕获这个异常将会直接退出程序执行,当然也可以捕获这个异常进行一些其他操作(比如清理工作)。sys.exit()函数是通过抛出异常的方式来终止进程的,也就是说如果它抛出来的异常被捕捉到了的话程序就不会退出了,而是去进行一些清理工作。SystemExit 并不派生自Exception 所以用Exception捕捉不到该SystemEixt异常,应该使用SystemExit来捕捉。该方法中包含一个参数status,默认为0,表示正常退出, 其他都是异常退出。还可以这样使用:sys.exit("Goodbye!"); 一般主程序中使用此退出.
- sys.path
sys.path是python的搜索模块的路径集。是一个list。
注释:我们在import模块的时候流程是:首先会从python的内置模块中查找是否含义该模块的定义若未查询到会从sys.path对应的模块路径查询是否含有对应模块的定义,如果搜索完成依然没有对应A模块时则抛出import的异常。
下面我们看看sys.path路径里面有什么? 我们看到里面很多地址信息。
import sys
print(sys.path)
['D:\\python3study', 'D:\\python3study', 'C:\\Users\\aaron\\AppData\\Local\\Programs\\Python\\Python38\\python38.zip', 'C:\\Users\\aaron\\AppData\\Local\\Programs\\Python\\Python38\\DLLs', 'C:\\Users\\aaron\\AppData\\Local\\Programs\\Python\\Python38\\lib', 'C:\\Users\\aaron\\AppData\\Local\\Programs\\Python\\Python38', 'D:\\python3study\\venv', 'D:\\python3study\\venv\\lib\\site-packages', 'D:\\python3study\\venv\\lib\\site-packages\\setuptools-40.8.0-py3.8.egg', 'D:\\python3study\\venv\\lib\\site-packages\\pip-19.0.3-py3.8.egg']
既然sys.path本身是一个列表,那么我们来看看这个sys.path这个对象包含了什么方法:
import sys
print(dir(sys.path))
['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
添加路径
import sys sys.path.append("c:\\test") print(sys.path) ['D:\\python3study', 'D:\\python3study', 'C:\\Users\\aaron\\AppData\\Local\\Programs\\Python\\Python38\\python38.zip', 'C:\\Users\\aaron\\AppData\\Local\\Programs\\Python\\Python38\\DLLs', 'C:\\Users\\aaron\\AppData\\Local\\Programs\\Python\\Python38\\lib', 'C:\\Users\\aaron\\AppData\\Local\\Programs\\Python\\Python38', 'D:\\python3study\\venv', 'D:\\python3study\\venv\\lib\\site-packages', 'D:\\python3study\\venv\\lib\\site-packages\\setuptools-40.8.0-py3.8.egg', 'D:\\python3study\\venv\\lib\\site-packages\\pip-19.0.3-py3.8.egg',
'c:\\test']
删除路径
import sys
sys.path.remove("c:\\test")
print(sys.path)
['D:\\python3study', 'D:\\python3study', 'C:\\Users\\aaron\\AppData\\Local\\Programs\\Python\\Python38\\python38.zip', 'C:\\Users\\aaron\\AppData\\Local\\Programs\\Python\\Python38\\DLLs', 'C:\\Users\\aaron\\AppData\\Local\\Programs\\Python\\Python38\\lib', 'C:\\Users\\aaron\\AppData\\Local\\Programs\\Python\\Python38', 'D:\\python3study\\venv', 'D:\\python3study\\venv\\lib\\site-packages', 'D:\\python3study\\venv\\lib\\site-packages\\setuptools-40.8.0-py3.8.egg', 'D:\\python3study\\venv\\lib\\site-packages\\pip-19.0.3-py3.8.egg']
sys.stdin,sys.stdout,sys.stderr
这三个对象属于类文件流对象。分别表示标准UNIX概念中的标准输入,标准输出,标准错误。
比如我们熟知的print()函数就是调用了sys.stdout.write方法。
该三个对象优势在于可以将输出内容重定向到文件当中。