WHCSRL 技术网

中年大叔蝉联周榜亚军!今天告诉你一个小秘技:怎样用python来获取各种DOS命令显示的内容?注意不是返回值哦!

首先,要恭喜一下自己蝉联了周榜亚军!

言归正传,我们经常在C/C++中用“system("pause");”作暂停命令外,还有另外一些功能也很不错:

  1. system("title C++颜色设置程序"); //设置控制台窗口的标题,即cmd.exe的标题
  2. system("mode con cols=64 lines=25"); //设置窗口宽度高度
  3. system("date /t"); //显示日期
  4. system("time /t"); //显示时间
  5. system("shutdown -s -t 3600"); //延时关机 3600秒即一小时后关机
  6. system("shutdown -a"); //取消延时关机
  7. system("color 0B"); //设置文本和背景颜色

核心就用system()函数调用windows操作系统的DOS命令来做点事情,iOS、linux系统中也一样,仅需把引号中的命令行字符串换成对应操作系统的命令即可。

Python语言中,os库的system()函数同样也是这个功能,举个例子:

  1. >>> import os
  2. >>> for _ in range(5):
  3. t = os.system('echo ')
  4. >>> t
  5. 0
  6. >>>

以上代码可以发出5次蜂鸣声,这个实质就是ascii字符7(beep)的显示。它在Python IDLE窗口中呈现为“echo ”中的那个粗圆点,可以用alt键+小键盘上的007键入;在DOS窗口下的python中除了这个方法还能用“Ctrl+G”录入,呈现为“^G”。

代码运行结束后,t 就接受了echo命令的返回值,DOS命令执行成功一般都返回 0

同样换个DOS命令“Date /t”来显示日期:

  1. >>> import os
  2. >>> os.system('Date /t')
  3. 0
  4. >>>

同样,也只返回一个 0 ,没有见到日期显示,但在控制台窗口下是可以显示的:

 time 命令也一样,另外这两个命令还能用“echo 环境变量”来实现。看上图中语句返回的两行第一行显示的是我们想获取的值,第二行是命令返回值,通过赋值只能得到这个返回值 0 。

题外话:DOS中用两个%%把环境变量名括起来表示一个环境变量, 可以用dos命令 set 来显示和设置这些系统环境变量。除了用“set path”外,path 命令可以单独显示 %%PATH%% 变量。

从上图中可以看到,用引号和波浪线 :~pos, length 可以把环境变量值按开始位置和所要长度来分割开,类似python的字符串切片: str='2021-10-19'; str[0:4]。

各个时期的Dos版本的内部命令有增有减个数不定,另外还有很多的外部命令可用。 

  1. D:>set os
  2. OS=Windows_NT
  3. D:>set systemdrive
  4. SystemDrive=C:
  5. D:>set windir
  6. windir=C:Windows
  7. D:>set path
  8. Path=C:Windowssystem32;C:Windows;C:WindowsSystem32Wbem;C:WindowsSystem32WindowsPowerShellv1.0;D:PythonScripts;D:Python
  9. PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
  10. D:>set pathext
  11. PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
  12. D:>path
  13. PATH=C:Windowssystem32;C:Windows;C:WindowsSystem32Wbem;C:WindowsSystem32WindowsPowerShellv1.0;D:PythonScripts;D:Python
  14. D:>tree
  15. ...
  16. ...
  17. ...
  18. ...
  19. 省去N多行

回到正题,发个小秘技:

怎样才能获取dos命令显示的内容而不是返回值?

这要请出os库的另一个函数 popen() ,和fopen读取文件差不多,也用readlines()读取出信息的每一行;每一行都是一个以' '结尾的字符串元素,保存在同一个列表里,基本用法如下:

  1. >>> import os
  2. >>> os.popen('date /t')
  3. <os._wrap_close object at 0x0000000002C82580>
  4. >>> #一定要加上readlines()方法:
  5. >>> os.popen('date /t').readlines()
  6. ['2021/10/19 周二 ']
  7. >>> os.popen('set path').readlines()
  8. ['PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;
  9. C:\Windows\System32\WindowsPowerShell\v1.0\;
  10. D:\Python\Scripts\;
  11. D:\Python\ ',
  12. 'PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC ']
  13. >>>

自定义几个能抓取DOS命令返回信息的函数

  1. >>> import os
  2. >>> def Date():
  3. command = 'echo %%date:~0,4%%年%%date:~5,2%%月%%date:~8,2%%日'
  4. return os.popen(command).readlines()[0][:-1]
  5. >>> Date()
  6. '2021年10月19日'
  7. >>>
  8. >>> def Weekday():
  9. command = 'echo 星期%%date:~-1%%'
  10. return os.popen(command).readlines()[0][:-1]
  11. >>> Weekday()
  12. '星期二'
  13. >>>
  14. >>> def Time():
  15. command = 'echo %%time%%'
  16. return os.popen(command).readlines()[0][:8]
  17. >>> Time()
  18. '13:39:03'
  19. >>>
  1. >>> import os
  2. >>> def Dir(Drive):
  3. command = 'dir ' + Drive + ':'
  4. dirlist = os.popen(command).readlines()
  5. for d in dirlist:
  6. print(d, end='')
  7. print()
  8. >>> Dir('C')
  9. 驱动器 C 中的卷是 C_HD
  10. 卷的序列号是 401B-F400
  11. C: 的目录
  12. 2021/10/14 09:55 17,783 2021年xxxxxxxxx总结10.18.xlsx
  13. 2021/10/12 10:54 <DIR> Program Files
  14. 2021/10/12 10:54 <DIR> Program Files (x86)
  15. 2021/09/16 14:45 <DIR> temp
  16. 2021/03/18 15:42 <DIR> Users
  17. 2021/10/13 15:45 <DIR> Windows
  18. 2021/10/11 11:11 <DIR> XSBDownload
  19. 1 个文件 17,783 字节
  20. 6 个目录 93,678,710,784 可用字节
  21. >>>
  1. >>> def Path():
  2. command = 'path'
  3. dirlist = os.popen(command).readlines()
  4. dirlist = dirlist[0][:-1].split(';')
  5. for d in dirlist:
  6. print(d)
  7. print()
  8. >>> Path()
  9. PATH=C:Windowssystem32
  10. C:Windows
  11. C:WindowsSystem32Wbem
  12. C:WindowsSystem32WindowsPowerShellv1.0
  13. D:PythonScripts
  14. D:Python
  15. >>>

dos命令还有很多很多,其中有实用信息返回的都可以用os.system.popen().readlines()来获取。
 

一起学习交流 Python 的群二维码地址: http://qr01.cn/FHYKEa

 

推荐阅读