Python运行指令脚本

Python是一门脚本语言,我们可以使用Python进行操作脚本的编写,Python的基础模块中也能对系统的操作指令进行调用,操作其他脚本。

1OS模块

os.system()

os模块是Python的操作系统功能模块,提供了一个统一的操作系统接口函数。
可以通过os.system(commond)运行一个shell命令

import os

OUT = os.system(‘python children.py’)

该方法会创建子进程运行指令,方法只反馈运行状态,不能将命令输出到变量。会阻塞进程。

os.popen()

该方法是打开一个与command进程之间的管道。将command的执行结果作为一个文件对象返回,可以读或者写(由mode决定,mode默认是'r')。如果mode为'r',可以使用此函数的返回值调用read()来获取返回对象的内容。
该方法启动不会阻塞进程,但主进程会等该该方法结束后才结束,如果调用了read() 则会阻塞进程。

import os

OUT = os.popen(‘python children.py’)

print OUT.read()

2commands模块

该模块不支持window系统,并在python3的版本移除

commands.getoutput(command),该方法将command的执行结果当作字符串返回。
commands.getstatusoutput(command),该方法返回一个元祖,分别表示返回状态和执行结果。
会阻塞进程等待指令结束。

3subprocess模块

subprocess.Popen()

subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

上述方法会创建并返回一个子进程,并在子进程中执行指定的程序。
实例化 Popen 可以通过许多参数详细定制子进程的环境,但是只有一个参数是必须的,即位置参数 args ,下面也会详细介绍剩余的具名参数。

参数介绍:

  • args:要执行的命令或可执行文件的路径。一个由字符串组成的序列(通常是列表),列表的第一个元素是可执行程序的路径,剩下的是传给这个程序的参数,如果没有要传给这个程序的参数,args 参数可以仅仅是一个字符串。
  • bufsize:控制 stdin, stdout, stderr 等参数指定的文件的缓冲,和打开文件的 open()函数中的参数 bufsize 含义相同。
    executable:如果这个参数不是 None,将替代参数 args 作为可执行程序;
  • stdin:指定子进程的标准输入;
  • stdout:指定子进程的标准输出;
  • stderr:指定子进程的标准错误输出;
      对于 stdin, stdout 和 stderr 而言,如果他们是 None(默认情况),那么子进程使用和父进程相同的标准流文件。
      父进程如果想要和子进程通过 communicate() 方法通信,对应的参数必须是 subprocess.PIPE(见下文例4);
      当然 stdin, stdout 和 stderr 也可以是已经打开的 file 对象,前提是以合理的方式打开,比如 stdin 对应的文件必须要可读等。
  • preexec_fn:默认是None,否则必须是一个函数或者可调用对象,在子进程中首先执行这个函数,然后再去执行为子进程指定的程序或Shell。
  • close_fds:布尔型变量,为 True 时,在子进程执行前强制关闭所有除 stdin,stdout和stderr外的文件;
  • shell:布尔型变量,明确要求使用shell运行程序,与参数 executable 一同指定子进程运行在什么 Shell 中——如果executable=None 而 shell=True,则使用 /bin/sh 来执行 args 指定的程序;也就是说,Python首先起一个shell,再用这个shell来解释指定运行的命令。
  • cwd:代表路径的字符串,指定子进程运行的工作目录,要求这个目录必须存在;
  • env:字典,键和值都是为子进程定义环境变量的字符串;
  • universal_newline:布尔型变量,为 True 时,stdout 和 stderr 以通用换行(universal newline)模式打开

该方法不会阻塞父进程,但同 Linux 中创建子进程类似,父进程创建完子进程后,并不会自动等待子进程执行,父进程在子进程之前推出将导致子进程成为孤儿进程,孤儿进程统一由 init 进程接管,负责其终止后的回收工作。如果父进程在子进程之后终止,但子进程终止时父进程没有进行最后的回收工作,子进程残留的数据结构称为僵尸进程。大量僵尸进程将耗费系统资源,因此父进程及时等待和回收子进程是必要的,除非能够确认自己比子进程先终止,从而将回收工作过渡给 init 进程。
这个等待和回收子进程的操作就是wait()函数

import subprocess

p = subprocess.Popen('ls -l', shell=True)

p.returncode //None为子进程未结束,0正常退出,>0异常退出,<0子进程被杀死

p.wait()//等待子进程 p 终止,返回 p.returncode 属性

包装方法

为了方便使用,subprocess将Popen包装为一些便利函数提供使用。

  1. subprocess.call() 执行指定的命令,返回命令执行状态,其功能类似于os.system(cmd)。
  2. subprocess.check_call() Python 2.5中新增的函数。 执行指定的命令,如果执行成功则返回状态码,否则抛出异常。
  3. subprocess.check_output() Python 2.7中新增的的函数。执行指定的命令,如果执行状态码为0则返回命令执行结果,否则抛出异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值