python3 sys模块
sys模块和os模块是很常用的模块,我们应该熟悉它的用法。
sys模块
sys.argv
获取命令行参数,返回值是List,第一个元素是程序本身
例子:
创建文件test.py
,内容如下:
import sys
print(sys.argv)
在命令行中运行,测试文件。
[alphababy@AlphaBaby] py3test$ python3 test.py
['test.py']
[alphababy@AlphaBaby] py3test$ python3 test.py
['test.py']
[alphababy@AlphaBaby] py3test$ python3 test.py 33
['test.py', '33']
看这样一个有趣的小程序,程序的功能是计算第一个参数的值,并返回
修改test.py
文件如下:
import sys
print(eval(sys.argv[1]))
然后在命令行中调用解释器执行test.py
文件:
[alphababy@AlphaBaby] py3test$ python3 test.py 1+3
4
sys.exit(n)
程序退出,如果是正常退出是sys.exit(0)
,这里的参数可以自己填,但是对于程序是怎样退出的应该传参是几,应该自己定义好,这样别人在运行你的程序的时候才知道你是怎样退出的,是正餐退出还是意外退出。
例子:
import sys
print('hello')
sys.exit(0)
print('python')
运行程序后发现在,程序输出hello
后并没有继续输出python
。因为在执行到sys.exit(0)
的时候程序就结束了。
sys.version
获取Python解释程序的版本信息
sys.maxsize
获取最大的Int值
sys.path
返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
比如就是我们在python源文件中import
引入模块的时候就会在sys.path
的目录中查找相应的模块,如果在这里面的目录中没有找到你要倒入的模块则会报错。
返回值是一个list
则我们如果想倒入一个自定义模块下面的的包或者是模块则可以使用list
的append
方法在PYTHONPATH环境变量中增加相应的路径。
sys.platform
返回操作系统的名称
sys.stdout, sys.stdin, sys.stderror
分别和输出输入,错误输出相关
sys.stdout.write(str)
sys.stdout.write
和print
都是输出相关的函数print
内部也是调用的sys.stdout
,sys.stdout
默认输出是屏幕。
import sys
s = 'test stdout'
print('--')
sys.stdout.write(s)
print('--')
class A(object):
pass
print(A)
sys.stdout.write(A)
print
什么类型都可以输出,但是sys.stdout.write
只可以输出字符串类型,否则报错。print
默认是最后换行,但是sys.stdout.write
默认不换行。
下面看我在百度找到的别人大佬写的一段代码:
import sys
file = sys.stdout # 存储原始的输出对象
sys.stdout = open('1.txt', 'w') # 重定向所有的写入内容到 1.txt 文件,
print('Citizen_Wang') # 写入到 1.txt 文件中,在上一行语句中改变了输出流到文件中
print('Always fall in love with neighbours') # 继续写入到文件中
sys.stdout.close() # 其实就是 open 文件之后的关闭
sys.stdout = file # 将 print 命令的结果返回给控制台
print('输出信息返回在控制台') # 该信息会在控制台也显示
下面讲一个有趣的实例(python实现命令行进度提示):
特别是在使用linux下载依赖或者软件的时候,都会提示一个百分数的进度,这种进度提示是怎么实现的呢?
我猜你肯定知道\n
, \t
, \d
等转移字符,但是你应该不知道、\r
这个转移字符,这个转移字符有什么用呢?看如下代码:
import time
import sys
for i in range(20):
print("个测试数据" + str(i), end="")
sys.stdout.flush() # 刷新缓冲区
time.sleep(1)
sys.stdout.flush()
的作用请看这里:https://blog.csdn.net/qq_20603001/article/details/62887099
这是一个简单的不能再简单的代码了,但是注意这里一直没有输出换行,接着看下面的代码,感受其中\r
的作用:
import time
import sys
for i in range(20):
if i%5 == 0:
print("\r", end="")
print("个测试数据" + str(i), end="")
sys.stdout.flush()
time.sleep(1)
当我们输出\r
的时候,在一行中并且在\r
前的所有字符将被清理掉。修改下代码继续运行测试:
import time
import sys
for i in range(20):
if i%5 == 0:
print("\r", end="")
print("个测试数据" + str(i)) # 去掉了, end="",末尾会打印出换行
sys.stdout.flush()
time.sleep(1)
当出现换行时,并不会清理掉在\r
字符前的内容,所以\r
只会清理掉只在一行中的内容。
补充, 这样更能理解
import time
import sys
for i in range(20):
print("\r", end="")
time.sleep(1)
print("个测试数据" + str(i), end="")
sys.stdout.flush()
time.sleep(1)
我们清楚了\r
的用法那就可以实现一个命令行进度提示了:
import sys
import time
print("downloading:")
def view_bar(num, total):
rate = float(num) / float(total)
rate_num = int(rate * 100)
r = "\r"+("="*(2*rate_num//10)+">")+(" "*(20-2*rate_num//10))+'%d%%' % (rate_num, )
sys.stdout.write(r)
sys.stdout.flush() # 刷新缓冲区
if __name__ == '__main__':
for i in range(0, 101):
time.sleep(0.01)
view_bar(i, 100)
print("\ndownload successful\n")