python调用cmd命令行操作

1、最简单的用法:subprocess模块

out = subprocess.Popen('tesseract 1.jpg result', shell = True),shell = True表示直接在解释器中运行,即不会弹出黑的命令行

该类用于在一个新的进程中执行一个子程序。即允许你去创建一个新的进程让其执行另外的程序,并与它进行通信,获取标准的输入、标准输出、标准错误以及返回码等。
注意:使用这个模块之前要先引入该模块。

Popen类

subprocess模块中定义了一个Popen类,通过它可以来创建进程,并与其进行复杂的交互。主要参数:

python调用cmd命令行操作_第1张图片

主要参数说明:

args:args should be a string, or a sequence of program arguments.也就是说必须是一个字符串或者序列类型(如:字符串、list、元组),用于指定进程的可执行文件及其参数。如果是一个序列类型参数,则序列的第一个元素通常都必须是一个可执行文件的路径。当然也可以使用executeable参数来指定可执行文件的路径。

stdin,stdout,stderr:分别表示程序的标准输入、标准输出、标准错误。有效的值可以是PIPE,存在的文件描述符,存在的文件对象或None,如果为None需从父进程继承过来,stdout可以是PIPE,表示对子进程创建一个管道,stderr可以是STDOUT,表示标准错误数据应该从应用程序中捕获并作为标准输出流stdout的文件句柄。

shell:如果这个参数被设置为True,程序将通过shell来执行。

env:它描述的是子进程的环境变量。如果为None,子进程的环境变量将从父进程继承而来。

创建Popen类的实例对象

res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

cmd:标准像子进程传入需要执行的shell命令,如:ls -al

subprocess.PIPE:在创建Popen对象时,subprocess.PIPE可以初始化为stdin, stdout或stderr的参数,表示与子进程通信的标准输入流,标准输出流以及标准错误。

subprocess.STDOUT:作为Popen对象的stderr的参数,表示将标准错误通过标准输出流输出。

Popen类拥有的方法及属性

1、Popen.pid

获取子进程的进程ID。

2、Popen.returncode

获取进程的返回码。如果进程未结束,将返回None。

3、communicate(input=None)

  • 该方法中的可选参数 input 应该是将被发送给子进程的数据,或者如没有数据发送给子进程,该参数应该是None。input参数的数据类型必须是字节串,如果universal_newlines参数值为True,则input参数的数据类型必须是字符串。
  • 该方法返回一个元组(stdout_data, stderr_data),这些数据将会是字节穿或字符串(如果universal_newlines的值为True)。
  • 如果在timeout指定的秒数后该进程还没有结束,将会抛出一个TimeoutExpired异常。捕获这个异常,然后重新尝试通信不会丢失任何输出的数据。但是超时之后子进程并没有被杀死,为了合理的清除相应的内容,一个好的应用应该手动杀死这个子进程来结束通信。
  • 需要注意的是,这里读取的数据是缓冲在内存中的,所以,如果数据大小非常大或者是无限的,就不应该使用这个方法。

4、poll()

检查子进程是否结束,并返回returncode属性。

5、wait()

等待子进程执行结束,并返回returncode属性,如果为0表示执行成功。

6、send_signal( sig) 发送信号给子进程。

7、terminate()  终止子进程。windows下将调用Windows API TerminateProcess()来结束子进程。

8、kill() 终止子进程。windows下将调用Windows API TerminateProcess()来结束子进程。

官方文档对这个函数的解释跟terminate()是一样的,表示杀死子进程。

例子:

#coding:utf-8
import subprocess
import os
def runCmd(cmd) :
        res = subprocess.Popen(cmd, shell=True,  stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
        sout ,serr = res.communicate() #该方法和子进程交互,返回一个包含 输出和错误的元组,如果对应参数没有设置的,则无法返回
        return res.returncode, sout, serr, res.pid #可获得返回码、输出、错误、进程号;

res = runCmd('dir')
print res[0], res[1], res[2], res[3]  #从元组中获得对应数据
 

你可能感兴趣的:(Python)