Python中执行系统命令常见的几种方法

Python015

Python中执行系统命令常见的几种方法,第1张

作为胶水语言,Python可以很方便地执行系统命令,从而帮助我们快速的完成任务而且Python执行系统命令可采用的方法有很多,本文重点介绍一下:os.system()、os.popen()和subprocess模块

1. os.system()

这个方法直接调用标准C的system()函数,仅仅在一个子终端运行系统命令,而不能获取执行返回的信息。

>>>import os

>>>output = os.system('cat /proc/cpuinfo')

processor : 0

vendor_id : AuthenticAMD

cpu family : 21

... ...

>>>output # doesn't capture output

0

2. os.popen()

这个方法执行命令并返回执行后的信息对象,是通过一个管道文件将结果返回。

>>>output = os.popen('cat /proc/cpuinfo')

>>>output

>>>print output.read()

processor : 0

vendor_id : AuthenticAMD

cpu family : 21

... ...

>>>

3. subprocess模块

该模块是一个功能强大的子进程管理模块,是替换os.system, os.spawn*等方法的一个模块。

>>>import subprocess

>>>subprocess.Popen(["ls", "-l"]) # python2.x doesn't capture

output

>>>subprocess.run(["ls", "-l"]) # python3.x doesn't capture

output

>>>total 68

drwxrwxr-x 3 xl xl 4096 Feb 8 05:00 com

drwxr-xr-x 2 xl xl 4096 Jan 21 02:58 Desktop

drwxr-xr-x 2 xl xl 4096 Jan 21 02:58 Documents

drwxr-xr-x 2 xl xl 4096 Jan 21 07:44 Downloads

... ...

>>>

该方法和C语言里的system函数是一致的。该方法的参数就是string类型的命令,返回值方面,linux和windows上的返回值不同。linux上,返回值为执行命令的exit值;而windows上,返回值则是运行命令后,shell的返回值。注意,该方法是没办法得到运行命令的输出的。

该方法返回的是file read的对象,如果想获取执行命令的输出,则需要调用该对象的read方法。

这三个方法是一个系列的,入参是string类型的命令,出参分别是输出,exit值,元祖(exit值,输出)。这个系列的方法相对来说也是最方便的,尤其第三个,可以同时返回exit值和输出,非常方便。

关于python调用cmd命令,主要介绍两种方式:

一、Python的OS模块

OS模块调用CMD命令有两种方式:os.system(),os.popen()。 都是用当前进程来调用。

1、os.system()

a、简单粗暴的执行cmd指令

b、返回结果为0表示执行成功,无法获取命令输出的内容,本在cmd输出的内容会直接在控制台输出。

c、当命令运行结束后接着往下面执行程序(同步阻塞式)。用法如:os.system("ipconfig")。

2、os.popen()

a、能获取DOS命令输出的内容。

b、os.popen()返回的是一个file对象,那么可以跟打开文件一样操作,r是以读的方式打开。

c、当命令运行结束后接着往下面执行程序(同步阻塞式)。

注意:os.popen() 方法用于从一个命令打开一个读写管道,在Unix,Windows中有效。

用法如:

with os.popen(r"adb devices","r")as f:

    text = f.read()

    print(text)# cmd输出结果

二、管道subprocess模块

a、在当前进程下产生子进程。

b、用wait()函数等待结果(异步非阻塞式)。

【方法1】

result = subprocess.check_output(r'adb devices') ## 命令执行的输出结果放到了result里

print(result)

【方法2】

process = subprocess.Popen(r'adb devices',shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)

command_output = process.stdout.read().decode('gbk')

print(command_output)

Notices: 

有些命令行是异步执行的不会马上返回输出,所以有时候我们要先等这个命令行执行完毕才能从stdout读出来数据。这个时候要加上

process.wait()

我的GitHub