浅谈Python中sys模块

import sys

sys.argv 

< 官方解释:

传递给Python脚本的命令行参数列表。argv是脚本名(它是操作系统,取决于它是否是完整的路径名)。如果使用-c命令行选项对解释器执行命令,argv 0被设置为字符串'-c'。如果没有将脚本名传递给Python解释器,argv 0就是空字符串。

要对标准输入或命令行给出的文件列表进行循环,请参阅fileinput模块。

>

获取命令行参数

sys.argv 属性获取命令行内容

将命令行参数以字符串形式收集为一个列表 ,默认以空格分割,如果不想需要加引号

sys.argv[0] 指向当前脚本文件名

sys.argv[1]以及[2]等等 指的是文件名后面输入的其他参数 已空空格分割

如:python3 tcp_.py 127.0.0.1 8888 中sys.argv[1]为‘127.0.0.1’,sys.argv[2]为‘8888’

注意python3 只是解释执行器,而.py文件才是第一个参数sys.argv[0]

sys.exit( [n] )

解释执行器执行到主程序末尾,会自动调用该方法退出,如果需要中途退出程序,可以调用此函数,结束当前程序执行过程,带有一个可选的参数。

import sys

print('hello')
print('yes')
sys.exit()

print('ok?')

运行结果:

hello
yes

这个可选参数可以是一个字符串,默认是0,当是字符串时,退出当前进程会打印该字符串。

import sys


sys.exit('Bye')

print('hello?') #进程结束,程序已退出,不会执行

结果:

Bye

sys.path 返回模块搜索路径的字符集合列表,可以将写好的模块放在这些路径中某个路径下,以使用import导入模块时保证解释执行器找到该模块。注意不要使用和系统中已有模块的文件名命名。否则搜索路径是一个很头疼的事情。

In [1]: import sys

In [2]: sys.path
Out[2]: 
['',
 '/usr/bin',
 '/usr/lib/python35.zip',
 '/usr/lib/python3.5',
 '/usr/lib/python3.5/plat-x86_64-linux-gnu',
 '/usr/lib/python3.5/lib-dynload',
 '/home/username/.local/lib/python3.5/site-packages',
 '/usr/local/lib/python3.5/dist-packages',
 '/usr/lib/python3/dist-packages',
 '/usr/lib/python3/dist-packages/IPython/extensions',
 '/home/username/.ipython']

模块也可以放在其他路径下面,这就需要在系统中添加一个路径,使用sys.path.append('自定义模块路径'),可以联想到在django中使用的类似该方法添加一个相对路径到你的工程文件中。这样才能保证自己添加的目录被解释执行器找到。

sys.modules

是一个全局字典,再启动Python后,该字典就加载到内存当中。每当导入新的模块,sys.modules将自动记录该模块。当第二次导入该模块时,Python会直接到字典中查找,如果没有再去添加,如果有则直接调用。这样加快了程序运行的速度。记住sys.modules是一个字典,拥有字典的所有方法。

In [3]: sys.modules
Out[3]: 
{
'IPython.utils.module_paths': 

<module 'IPython.utils.module_paths' from '/usr/lib/python3/dist-packages/IPython/utils/module_paths.py'>,

'ptyprocess': 
<module 'ptyprocess' from '/usr/lib/python3/dist-packages/ptyprocess/__init__.py'>,

...

}

用字典的方式获取键:

sys.modules.keys()
Out[4]: dict_keys([
'IPython.utils.module_paths'
, 'ptyprocess'
, 'IPython.core.displayhook'
, ...
,'random' 
,'posixpath'
,'readline'
])

获取所有的值:

 sys.modules.values()
Out[6]: dict_values([

<module 'IPython.utils.module_paths' from '/usr/lib/python3/dist-packages/IPython/utils/module_paths.py'>,
....
<module 'ptyprocess' from '/usr/lib/python3/dist-packages/ptyprocess/__init__.py'>,
...
<module 'IPython.utils.rlineimpl' from '/usr/lib/python3/dist-packages/IPython/utils/rlineimpl.py'>

])

根据具体的键获取值:

In [5]: sys.modules['os']
Out[5]: <module 'os' from '/usr/lib/python3.5/os.py'>

sys.stdin\ stdout \stderr

标准输入 输出 错误输入流文件。默认输入输出流键盘,屏幕终端,而这些包含标准的I/O流对象。print函数则是在标准输出流上进行的进一步封装,如果print不能满足你的输出,则可以通过标准输出去重定向到其他输出设备,输入同理。

关闭标准输入文件 sys.stdin.cloen()

关闭标准输出文件sys.stdout.close()

调用者两个方法时则无法从终端设备进行I/O操作。input和print也是无法运行的,因为这两个函数(对象)就是在标准输入输出流上的进一步封装。当使用sys.stdin.readine()获取终端输入的一行时,会包括看不见的回车符,也是占用一个字符的。

同理,如果要使用标准输出流多行显示时,需要加转义字符\n。

sys.stdin.readline([n]) : n读取的字符个数,超过n个字符则自动提交,清空缓冲区,不在接收,默认回车符\n清空

import sys

s = sys.stdin.readline()
print(s)
#sys.stdout.close()   #?考虑此处关闭标准输出流,下面的print函数还能否执行去输出
print(len(s))

输入输出结果

abc    #输入的数据 按了回车符相当于转移字符\n,清空了缓冲区
abc    #返回的数据 注意是用print函数输出的,标准输入流接收了abc\n四个字符 
       #而print函数的end参数默认添加一个\n 所有出现两个回车符,多出一个空行
4      #这里输出四个字符 包括转义字符\n

sys.stdout.write(text)

In [1]:import sys

In [2]:sys.stdout.write('adc\na\abc\td')
abc        #换行\n
abc    d    #\a响铃一次  \t水平制表 最后d后面没有任何字符,并没有换行符 没有\n

上面提到了缓冲区的概念,这个需要了解一下计算机的存储方式,以及阻塞,上面说到换行符可以清空缓冲区,直接提交到内存当中进行i\o操作,之所说换行符可以清空缓冲区,以输出函数为例,看一下print函数的原型。

 print(value,... sep=' ', end='\n', file=sys.stdout,flush=False)

这里应为print函数【或者你可以说是对象,python中一切皆对象】,flush默认是关闭的,即默认是不清空缓冲区的,那么是如何打印输出到终端呢,这是前面一个参数end默认为换行符\n,前面说到换行符也可以清空缓冲区,所以会直接打印。

如果设置end参数为空,flush默认为False,则不会立即打印到屏幕终端,除非程序运行结束之后。

举个例子,让程序进入死循环,看能否打印出。

import sys
 
 
print('hello',end='',flush=False)
while 1:
    pass

运行程序后,会发现光标一值在闪烁,而不会打印hello,因为flush为False,没有去清空缓冲区,而且下面的死循环保证程序从不会结束,所以不会打印到终端。到这里你可能会有疑问,flush默认是False,那么为什么你平时设置end为空时,还是可以答应出来,这是因为你的程序总会运行结束,所以总会从缓冲区打印出来。而不是像这个例子程序进步死循环,永远不会结束,永远看不到打印结果。

这里只是稍微介绍了sys模块,还有很多东西等着去探索,有关具体细节请查看官方文档:https://docs.python.org/3/library/sys.html?highlight=sys#module-sys

趁年轻,加油吧!脚踏实地,仰望星空。

猜你喜欢

转载自blog.csdn.net/qq_34935726/article/details/83046658
今日推荐