我们几乎可以在任何操作系统上通过命令行指令与操作系统进行交互,比如Linux平台下的shell。那么我们如何通过Python来完成这些命令行指令的执行呢?另外,我们应该知道的是命令行指令的执行通常有两个我们比较关注的结果:
- 命令执行的状态码--表示命令执行是否成功
- 命令执行的输出结果--命令执行成功后的输出
早期的Python版本中,我们主要是通过os.system()、os.popen().read()等函数来执行命令行指令的,另外还有一个很少使用的commands模块。但是从Python 2.4开始官方文档中建议使用的是subprocess模块,所以os模块和commands模块的相关函数在这里只提供一个简单的使用示例,我们重要要介绍的是subprocess模块。
一、os与commands模块
Python中提供了以下几个函数来帮助我们完成命令行指令的执行:
函数名 | 描述 |
---|---|
os.system(command) | 返回命令执行状态码,而将命令执行结果输出到屏幕 0代表执行成功,1代表没有此命令 |
os.popen(command).read() | 可以获取命令执行结果,但是无法获取命令执行状态码 |
commands.getstatusoutput(command) | 返回一个元组(命令执行状态码, 命令执行结果) |
说明:
1、os.popen(command)函数得到的是一个文件对象,因此除了read()方法外还支持write()等方法,具体要根据command来定;
2、commands模块只存在于Python 2.7中,且不支持windows平台,因此commands模块很少被使用。另外,commands模块实际上也是通过对os.popen()的封装来完成的。
1. os.system()函数实例
>>> import os
>>> os.system("dir")
驱动器 C 中的卷没有标签。
卷的序列号是 0008-F246
C:\Users\Songyu.Ji 的目录
2018-10-09 13:11 <DIR> .
2018-10-09 13:11 <DIR> ..
2018-03-02 09:50 <DIR> .android
2016-09-19 17:22 <DIR> .AndroidStudio2.1
2017-07-10 11:00 <DIR> .AndroidStudio2.3
2018-02-11 13:56 <DIR> .AndroidStudio3.0
2017-06-30 18:02 <DIR> .AndroidStudioPreview3.0
2017-01-09 13:25 <DIR> .atom
2017-11-10 10:13 60 .deliverycenter.installs
2018-03-16 13:28 <DIR> .eclipse
2018-03-02 09:41 <DIR> .gradle
2016-09-19 16:32 <DIR> .IdeaIC2016.2
2016-12-08 10:41 <DIR> .jmc
2017-04-20 09:38 <DIR> .m2
2017-04-20 09:38 <DIR> .myeclipse
2016-12-08 10:41 <DIR> .oracle_jre_usage
2018-03-16 13:51 <DIR> .p2
2018-05-17 14:18 <DIR> .PyCharmCE2018.1
2016-05-23 09:04 <DIR> .tooling
2018-01-04 18:37 <DIR> .VirtualBox
2018-01-03 11:29 <DIR> .vscode
2016-12-01 16:21 18 001
2017-09-21 13:26 2 1.txt
2018-08-22 19:18 <DIR> 3D Objects
2018-06-19 03:28 110,592 abl.elf
2018-06-19 03:28 15,180,547 adb.exe
2018-06-28 15:35 <DIR> adb1.0.32
2018-06-19 03:28 97,792 AdbWinApi.dll
2018-06-19 03:28 62,976 AdbWinUsbApi.dll
2017-10-11 14:27 <DIR> AndroidStudioProjects
2016-05-30 09:29 <DIR> CMB
2018-08-22 19:18 <DIR> Contacts
2018-10-12 10:33 <DIR> Desktop
2018-08-25 09:33 <DIR> Documents
2018-08-22 19:18 <DIR> Downloads
2018-06-19 03:28 7,743,657 fastboot.exe
2018-06-19 03:28 1,599 fastboot_flash_all.bat
2018-08-22 19:18 <DIR> Favorites
2016-09-19 16:35 <DIR> IdeaProjects
2018-09-03 09:33 <DIR> Links
2018-01-03 14:53 0 lua
2016-08-18 12:49 0 Microsoft
2018-08-22 19:18 <DIR> Music
2018-09-03 11:35 <DIR> OneDrive
2018-08-22 19:18 <DIR> Pictures
2018-08-13 13:50 4,001,559 pygame-1.9.4-cp36-cp36m-win32.whl
2018-08-22 19:18 <DIR> Saved Games
2018-08-22 19:18 <DIR> Searches
2018-10-12 09:57 <DIR> venv
2018-08-22 19:18 <DIR> Videos
2017-02-09 13:59 <DIR> VSWebCache
2018-09-04 17:19 39,407 图片1.png
13 个文件 27,238,209 字节
39 个目录 13,560,528,896 可用字节
0
>>> os.system("ls")
'ls' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
1
2. os.popen()函数实例
# -*- coding: UTF-8 -*-
import os
recode = os.popen("dir")
print(recode) #<os._wrap_close object at 0x00B2AEB0>
data = recode.read()
print(data)
"""
<os._wrap_close object at 0x01D6AED0>
驱动器 D 中的卷是 本地磁盘
卷的序列号是 D02E-AC3F
D:\Pycharm Community\FTP 的目录
2018-10-12 11:54 <DIR> .
2018-10-12 11:54 <DIR> ..
2018-10-12 11:49 <DIR> .idea
2018-10-12 11:13 1,013 socketCl