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方法。

  该三个对象优势在于可以将输出内容重定向到文件当中。

 

posted @ 2020-02-08 14:29  天象独行  阅读(438)  评论(0编辑  收藏  举报