目录
1、sys.stdout.flush()和sys.stdout.write()
2、python sys.path.append()和sys.path.insert()
3、linux下python解释器的sys.path路径如何添加
一、简介
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缓存机制,虽然stderr
和stdout
默认都是指向屏幕的,但是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 中也可以所用 sys 的 sys.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']