运行时服务(一)、sys模块

本文介绍了Python中的sys模块,包括常用函数及其应用场景。讲解了sys.stdout.flush()和sys.stdout.write()的作用,sys.path.append()和sys.path.insert()的区别,并提供了Linux环境下配置sys.path的方法。最后通过实例展示了如何使用sys.argv获取命令行参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、简介

二、常用函数

三、使用例子

1、sys.stdout.flush()和sys.stdout.write()

2、python sys.path.append()和sys.path.insert()

3、linux下python解释器的sys.path路径如何添加

4、 sys.argv

实例


一、简介

sys模块用于提供对python解释器的相关操作。

二、常用函数

sys.argv                                    命令行参数List,第一个元素是程序本身路径

sys.modules                                 返回系统导入的模块字段,key是模块名,value是模块

sys.exit(n)                                 退出程序,正常退出时exit(0)

sys.version                                 获取Python解释程序的版本信息

sys.maxint                                  最大的Int值

sys.path                                    返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值

sys.platform                                返回操作系统平台名称

sys.stdout.write('please:')
val = sys.stdin.readline()[:-1]

sys.modules.keys()                          返回所有已经导入的模块名

sys.modules.values()                        返回所有已经导入的模块

sys.exc_info()                              获取当前正在处理的异常类,exc_type、exc_value、exc_traceback当前处理的异常详细信息

sys.exit(n)                                 退出程序,正常退出时exit(0)

sys.hexversion                              获取Python解释程序的版本值,16进制格式如:0x020403F0
sys.version                                 获取Python解释程序的

sys.api_version                             解释器的C的API版本

sys.version_info
‘final’表示最终,也有’candidate’表示候选,serial表示版本级别,是否有后继的发行

sys.displayhook(value)                      如果value非空,这个函数会把他输出到sys.stdout,并且将他保存进__builtin__._.指在python的交互式解释器里,’_’ 代表上次你输入得到的结果,hook是钩子的意思,将上次的结果钩过来

sys.getdefaultencoding()                    返回当前你所用的默认的字符编码格式

sys.getfilesystemencoding()                 返回将Unicode文件名转换成系统文件名的编码的名字

sys.setdefaultencoding(name)                用来设置当前默认的字符编码,如果name和任何一个可用的编码都不匹配,抛出 LookupError,这个函数只会被site模块的sitecustomize使用,一旦别site模块使用了,他会从sys模块移除

sys.builtin_module_names                    Python解释器导入的模块列表

sys.executable                              Python解释程序路径
 
sys.getwindowsversion()                     获取Windows的版本

sys.copyright                               记录python版权相关的东西

sys.byteorder                               本地字节规则的指示器,big-endian平台的值是’big’,little-endian平台的值
是’little’

sys.exc_clear()                             用来清除当前线程所出现的当前的或最近的错误信息

sys.exec_prefix                             返回平台独立的python文件安装的位置

sys.stderr                                  错误输出

sys.stdin                                   标准输入

sys.stdout                                  标准输出

sys.platform                                返回操作系统平台名称

sys.path                                    返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值

sys.maxunicode                              最大的Unicode值

sys.maxint                                  最大的Int值

sys.version                                 获取Python解释程序的版本信息

sys.hexversion                              获取Python解释程序的版本值,16进制格式如:0x020403F0

三、使用例子

1、sys.stdout.flush()和sys.stdout.write()

当我们打印一些字符时,并不是调用print函数后就立即打印的。一般会先将字符送到缓冲区,然后再打印。这就存在一个问题,如果你想立刻看到日志,但由于缓冲区没满,不会打印。就需要采取一些手段。如每次打印后强行刷新缓冲区。

解决方案:

  • sys.stdout.flush()
    python的stdout是有缓冲区的,给你个例子你就知道了
import time
import sys
 
for i in range(5):
    print (i)
    #sys.stdout.flush()
    time.sleep(1)

这个程序本意是每隔一秒输出一个数字,但是如果把这句话sys.stdout.flush()注释的话,你就只能等到程序执行完毕,屏幕上会一次性输出0,1,2,3,4。如果你加上sys.stdout.flush(),刷新stdout,这样就能每隔一秒输出一个数字了。可以用在网络程序中多线程程序,多个线程后台运行,同时要能在屏幕上实时看到输出信息。

  • python -u xx.py

用网上的一个程序示例来说明,python中stdout默认需要缓存后再输出到屏幕,而stderr则直接打印到屏幕

import sys
 
sys.stdout.write("stdout1")
sys.stderr.write("stderr1")
sys.stdout.write("stdout2")
sys.stderr.write("stderr2")

其中sys.stdout.write()和sys.stderr.write()均是向屏幕打印的语句。其实python中的print语句就是调用了sys.stdout.write(),例如在打印对象调用print obj时,事实上是调用了 sys.stdout.write(obj+'\n')。

预想的结果是:stdout1stderr1stdout2stderr2
实际的结果为:stderr1stderr2stdout1stdout2

原因是python缓存机制,虽然stderrstdout默认都是指向屏幕的,但是stderr是无缓存的,程序往stderr输出一个字符,就会在屏幕上显示一个;而stdout是有缓存的,只有遇到换行或者积累到一定的大小,才会显示出来。这就是为什么上面的会最先显示两个stderr的原因!

  • - u参数的使用

有了上面的铺垫,就可以引出python 的- u参数了。python命令加上- u(unbuffered)参数后会强制其标准输出也同标准错误一样不通过缓存直接打印到屏幕。

运行结果 :stdout1stderr1stdout2stderr2
这样变成了预期的输出了。

不难看出在将python执行脚本输出到屏幕结果直接重定向到日志文件的情况下,使用- u参数,这样将标准输出的结果不经缓存直接输出到日志文件。

2、python sys.path.append()和sys.path.insert()

python程序中使用 import XXX 时,python解析器会在当前目录、已安装和第三方模块中搜索 xxx,如果都搜索不到就会报错。

使用sys.path.append()方法可以临时添加搜索路径,方便更简洁的import其他包和模块。这种方法导入的路径会在python程序退出后失效。

1. 加入上层目录和绝对路径

import sys
sys.path.append('..') #表示导入当前文件的上层目录到搜索路径中
sys.path.append('/home/model') # 绝对路径
from folderA.folderB.fileA import functionA

2. 加入当前目录

import os,sys
sys.path.append(os.getcwd())

os.getcwd()用于获取当前工作目录

3. 定义搜索优先顺序

import sys
sys.path.insert(1, "./model")

sys.path.insert(1, "./crnn")定义搜索路径的优先顺序,序号从0开始,表示最大优先级,sys.path.insert()加入的也是临时搜索路径,程序退出后失效。

3、linux下python解释器的sys.path路径如何添加

使用pycharm时, pycharm会自动把我们新建的每个项目都加入到sys.path路径中, 我们在使用过程中根本不涉及项目路径的处理, 但是当项目部署到linux上时, 问题就来了, linux上可没有pycharm来帮我们处理路径. 解决如下:

1. 使用命令行的形式添加, 虽然方便, 但是只对本次对话生效, 下次还的处理

export PYTHONPATH=/home/目录/项目根目录/            # 等号后为项目的根目录路径

2. 编辑配置文件

vim /etc/profile

在最后一行完整添加如下命令, 保存退出后重新登陆即可生效

export PYTHONPATH=/home/目录/项目根目录/ 

3. 编辑配置文件, 重新登录, 只针对编辑时的登录用户生效

vim ~/.bash_profile

在最后一行完整添加如下命令, 保存退出后重新登陆即可生效

export PYTHONPATH=/home/目录/项目根目录/ 

4、 sys.argv

Python 中也可以所用 syssys.argv 来获取命令行参数:

  • sys.argv 是命令行参数列表。

  • len(sys.argv) 是命令行参数个数。

注:sys.argv[0] 表示脚本名。

实例

test.py 文件代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import sys

print '参数个数为:', len(sys.argv), '个参数。'
print '参数列表:', str(sys.argv)

执行以上代码,输出结果为:

$ python test.py arg1 arg2 arg3
参数个数为: 4 个参数。
参数列表: ['test.py', 'arg1', 'arg2', 'arg3']

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wanderer001

ROIAlign原理

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值