一 前言
在上篇《关于os.popen你可能不知道的》中,提到了调用第三方工具或命令的os.popen方法,同时也指出了使用中可能遇到的坑。本文就介绍下python提供了哪些方法可以执行第三方工具或命令,以及它们的用法和区别。
二 主要方法
1. os.system
这个应该是用法最简单的方法了,os.system(“cmd”),直接传入要执行的命令字符串即可。注意返回值,它的返回值不是执行命令的返回结果,如果命令执行成功,则返回0;否则,返回其他值。另外,该方法是阻塞的,也就是说,只有调用的命令执行完毕返回后,才会继续运行后面的代码行。
2. os.popen
请参考《关于os.popen你可能不知道的》,不再赘述。
3. Subprocess.Popen
subprocess模块是推荐的用来替换一些老的模块和函数,如:os.system、os.popen等,定义了一个类Popen,使用Popen来创建进程,并与进程交互。
函数原型:
class subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None)
参数解释:
参数名 |
参数说明 |
args |
字符串或列表 |
bufsize |
0-无缓冲;1-行缓冲;其他正值-缓冲区大小;负值-默认系统缓冲(一般全缓冲) |
executable |
一般不用,args字符串或列表第一项表示程序名 |
stdin stdout stderr |
None-没有重定向,继承父进程 PIPE-创建管道 文件对象 文件描述符 stderr还可设置为STDOUT |
preexec_fn |
钩子函数,在fork和exec之间执行(unix) |
close_fds |
Unix下执行新进程前是否关闭0/1/2之外的文件; Windows下是否继承父进程的文件描述符 |
shell |
如果设置为True,则unix下相当于args前面加”/bin/sh” “-c”; Windows下相当于添加”cmd.exe /c” |
cmd |
设置工作目录 |
env |
设置环境变量 |
universal_newlines |
各种换行符统一处理成”\n” |
startupinfo |
Windows下传递给CreateProcess的结构体 |
creationflags |
Windows下传递CREATE_NEW_CONSOLE创建自己的控制台窗口 |
从Popen提供的参数数量就能感知其功能强大,但使用Popen函数注意:如果运行cmd命令时产生内容非常多,而标准输出使用subprocess提供的PIPE,输出内容可能塞满缓冲区,造成阻塞。一般的解决方法是自定义文件流代替标准输出的subprocess.PIPE。
4. subprocess.call
函数原型:
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
函数解释:
Run the command described by args. Wait for command to complete, then return the returncode attribute
该函数执行args接收的命令,等待命令执行完成,然后返回returncode。
从函数解释可知,该函数是阻塞型的,会一直等待子进程运行结束,并返回进程的returncode后,才会继续运行程序后面的代码行。如果不需要与子进程进行交互,且需要阻塞,可以使用该函数来完成任务。
三 总结
在调用第三方工具的方法上,python本身提供了相当多的实现方法,我们在使用时,需要根据实际问题、各种方法的特性进行选择。
四 其他资源
关于python学习、分享、交流,笔者开通了微信公众号【小蟒社区】,感兴趣的朋友可以关注下,欢迎加入,建立属于我们自己的小圈子,一起学python。