os, sys —— Python系统编程

作者: EEboardMM
上传时间为: 2015-08-03 09:00 AM

本文经原作者同一并委托转载

地址:原文地址

1. Python系统库

Python内部集成了与系统相关的函数库(或称模块),本节主要介绍sys和os两个库。
sys是系统参数和功能库,用来支持Python解释器的运行,其中保存了一些Python解释器使用或维护的变量。os库是混合操作系统接口,杂糅了各种获取操作系统信息和访问操作系统的函数。

1.1. sys模块
如果想要使用sys 模块只需要对其进行引用:

import sys

我们可以在IDLE中测试sys模块的功能。下面为sys模块中一些常用的功能:

表1 sys 模块常用功能

参数描述
sys.platform显示操作系统名称
sys.version显示Python解释器版本
sys.copyright显示解释器版权
sys.path显示Python模块的搜索路径(import的时候从这些路径查找模块)
sys.argv[]参数列表,使用该功能可以在命令行运行Python脚本时追加参数

图 树莓派(Linux)中执行效果

图 Windows中执行效果

sys.argv是一个数组,argv[0]表示本程序的名称,argv[1]表示第1个参数,argv[2]表示第2个参数,以此类推。下面的代码演示了sys.argv的使用效果:

import sys

for strArg in sys.argv:
        print(strArg)

在终端中执行代码:

$ python show_args.py arg1 arg2 arg3 arg4 arg5

图 sys.argv使用效果

1.2. os模块
与sys模块相同,使用os模块前需要引用操作:

import os

下面为sys模块中一些常用的功能:

表2 os模块常用功能

参数描述
os.uname()显示操作系统信息:系统名称、主机名、版本、发布时间和硬件平台
os.getlogin()显示当前登录的用户名
os.getpid()显示本进程的进程号
os.kill(pid, signal)向指定PID的进程发送信号
os.getcwd()获取当前路径
os.chdir(path)改变当前路径
os.mkdir(path)创建目录
os.rmdir(path)删除(非空)目录
os.rename(src, dst)重命名文件,将src重命名为dst
os.remove(path)删除文件(不能删除目录)
os.system(command)调用shell执行指令,阻塞执行
os.popen(command)与os.system类似,非阻塞执行,可以对命令的返回结果进行操作
os.fork()创建子进程
os.pipe()用于进程间通信

图 调用os模块

fork和pipe函数我们会在后面的多进程操作中讲到,这里首先介绍如果通过system和popen函数调用来执行系统命令。
os.system()非常适合执行简单的shell命令,等同于在shell下进行输入。命令如果执行成功会返回0,执行结果会通过终端输出。需要注意的是,os.system()以阻塞方式执行,程序将等待os.system()调用的命令执行完成后才继续运行。下面是一个简单的测试程序:

import os

print("Running date command...")
ret = os.system("date")
print("Return number: %d\n" %ret)

print("Running uname command...")
ret = os.system("uname -a")
print("Return number: %d\n" %ret)

print("Running an incorrect command...")
ret = os.system("incorrect_command")
print("Return number: %d\n" %ret)

运行结果


os.popen()不会阻塞程序的运行,并且可以对shell命令返回的结果进行处理。下面的代码演示了如何通过os.popen()函数监控内存使用率,同样的操作可以应用于获取各种系统信息。

import os
import time
import re

while True:
    # Get memory usage info
    cpuinfo = os.popen("free -m | grep Mem")
    strMem = cpuinfo.readline()

    # Get all the number from string
    numMem = re.findall("\d+", strMem)
    print("Total memory: %sMB, Used memory: %sMB, Memory usage:%d%%" \
        %(numMem[0], numMem[1], int(numMem[1])*100/int(numMem[0])))

    time.sleep(3)

其实这里只是提取了free命令返回的数据。re.findall()函数通过正则表达式将字符串中的整数本分都提取出来并保存为数组。

运行效果
全部评论 ()

创建讨论帖子

登录 后参与评论
系统提示