Python学习笔记五:subprocess子进程模块

如我之前发的文章《项目中根据相对路径和绝对路径获取文件/资源的方法》,这篇文章介绍了Java中可以通过Runtime和ProcessBuilder来执行子进程或

本篇文章给大家谈谈Python学习笔记五:subprocess子进程模块,以及对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

创建子进程

创建子进程执行命令最典型的用法是使用Popen函数:

subprocess.Popen(自我,args,bufsize=0,可执行文件=无,stdin=无,stdout=无,stderr=无,preexec_fn=无,close_fds=False,shell=False,cwd=无,env=无,universal_newlines=False,startupinfo=None,creationflags=0)该函数的参数解释如下:

args:字符串或列表,代表要执行的程序、命令和参数。如果是字符串,则字符串中就是要执行的程序(命令)和参数;如果是列表,则列表的第一个元素是可执行文件的路径,后续元素是可执行文件的路径。传递的参数。另外,第一个元素不需要给出可执行程序的完整路径,而只需给出需要执行的程序的名称,然后通过下面的executable参数指定可执行文件路径。

bufsize:整数,缓冲区的大小。子进程的输入流、输出流、错误流都会有缓冲区。该参数指定缓冲区的大小。

executable:字符串,可执行程序的完整路径。如果args参数没有给出可执行程序的完整路径,则通过executable给出可执行程序的完整路径。

stdin、stdout、stderr:子进程的标准输入、输出和错误。可以指定为管道(PIPE)、文件描述符(fd)或文件对象,也可以设置为None,表示这些参数是从父进程继承的。

preexec_fn:指定子进程运行前要调用的可执行对象。

close_fds:在Windows平台下,如果close_fds设置为True,则新创建的子进程将不会继承父进程的输入、输出和错误管道。我们无法将close_fds 设置为True 并重定向子进程的标准输入、输出和错误(stdin、stdout、stderr)。

shell:布尔值,如果该值为true,则表示子进程中的命令是通过shell执行的。

cwd:字符串,设置要执行的子进程的工作目录。

env: dict,指定子进程的环境变量。如果设置为None,则子进程的环境变量将从父进程继承。

universal_newlines:布尔值,指定子进程的换行符。例如:在Windows环境中,换行符是’/r/n’,但在Unix环境中,它是’/n’。如果该参数设置为True,则子进程中的换行符将被视为’/n’。

例子:

波彭

这样,我们创建了一个子进程,args参数设置为一个列表,列表的第一个元素代表可执行程序。子进程执行了“/Users/racing/Downloads”目录下的“ls -la”命令(注:ls是Unix系统中的可执行程序,其路径已添加到系统环境变量path中)。

另一个例子:

波彭

子进程的args传递一个字符串,其中包含可执行程序和参数,并指定执行时使用的shell。子进程使用shell 执行目录“/Users/racing/Downloads”中的“cat PR_curve.py”命令。

另一个例子:

波彭

子进程的args以列表形式传递,列表的第一个元素包含可执行程序bash的完整路径。子进程使用bash 执行目录“/Users/racing/Downloads”中的“cat PR_curve.py”命令。

其实使用subprocess,可以直接传入外部程序的完整路径然后执行,比如QQ什么的。

注意:Popen() 创建一个子进程并执行它。子进程的执行不会阻塞父进程。子进程和当前父进程是异步执行的。

获取子进程输入输出

如果需要与子进程交互,需要设置子进程的标准输入和输出。最常见的一种是使用通讯功能。

p.communicate(input=None) 使用p=subprocess.Popen() 创建子进程后,可以使用outputdata, errdata=p.communicate(input=None) 来获取子进程的输出和错误信息。

Python学习笔记五:subprocess子进程模块

communicate 会阻塞当前父进程,直到子进程执行完毕,父进程才会继续执行。如果父进程想要向子进程stdin发送数据或者读取子进程的标准输出和标准错误输出,则必须将stdin或stdout或stderr设置为PIPE。这里输入的输入是通过stdin输入到Popen中命令的参数,输入的内容不被视为Popen中命令的命令行参数。 communicate()函数返回一个元组,第一个元素是子进程的输出信息,第二个元素是子进程的错误信息。

例如:

交流

子进程在Windows下执行dir命令,获取子进程的输出信息和错误信息。

再次强调,如果需要通过communicate获取子进程的输出信息,一定要在使用Popen创建子进程时将stdout设置为subprocess.PIPE。

检查子进程是否结束

p.poll() poll函数用于检查子进程是否结束。它将返回一个数字。 0表示子进程已经结束。

阻塞父进程,等待子进程执行结束

p.wait() wait函数阻塞当前父进程,等待子进程结束。子进程结束后,返回子进程的退出值。 0表示正常执行完成。

注意:如果子进程向stdout或stderr管道输出大量数据并达到系统管道的缓存大小,子进程将等待父进程读取管道,如果父进程正在等待这一次,将会产生一个传奇。系统死锁会带来非常严重的后果。建议使用communicate()来避免这种情况。

获取子进程属性

p.returncodereturncode是子进程的返回值。如果值为0,则表示子进程已经正常执行。如果是其他值,则说明子进程执行出错。

p.pidpid 是子进程的进程号。注意:如果创建子进程时Popen函数的shell参数设置为True,那么这里的pid指的是子进程shell的进程号。

终止子进程

p.terminate()terminate函数用于终止子进程。在Unix系统下,该函数发送一个SIGTERM信号;在Windows下,调用TerminateProcess()来终止子进程。

Kill函数是强制杀死子进程。在Unix系统下,该函数发送SIGKILL信号,就像在命令行执行kill一样;而在Windows下,效果与terminate函数相同。

创建子进程并等待子进程执行完毕(推荐)

p=subprocess.call(args) 如上所述,使用Popen函数会导致子进程异步执行。如果需要等待子进程完成执行,则需要手动调用wait函数或者communicate函数。更好的方法是使用call函数创建子进程。

call函数的参数与Popen函数的参数相同,但是call函数也创建了一个子进程并在创建后立即执行,而当前进程等待子进程执行完成才继续。

如果我们的父进程不需要与子进程交互,需要等待子进程完成执行,建议使用该函数来执行子进程。

如果喜欢的话请点个赞或者关注吧!

更多文章

Python学习笔记四:os和os.path文件路径模块

分布式要点:MongoDB分片和部署MongoDB分布式集群

Spring开发精要:事务管理、Hibernate集成

Python网络爬虫:Stewardess.com、尴尬白、xxx结果图片和源代码

用户评论

Python学习笔记五:subprocess子进程模块
七级床震

以前一直用os库操作命令行,发现subprocess模块确实更高级点!功能更多,输出可视化也很方便,以后我肯定要用到!

    有15位网友表示赞同!

Python学习笔记五:subprocess子进程模块
慑人的傲气

终于有人讲解了subprocess的使用详解!之前总觉得这个模块有点神秘,学习起来卡壳。这篇笔记清晰易懂,很多概念一下子就明白了。比看官方文档还容易理解多了。

    有11位网友表示赞同!

Python学习笔记五:subprocess子进程模块
剑已封鞘

我觉得Python的内置函数和模块很多很强大,但是官方文档经常过于抽象,读着像是在看英文原版书一样。幸好还有这种有针对性讲解的文章,能让人更容易入门学习。

    有8位网友表示赞同!

Python学习笔记五:subprocess子进程模块
陌颜

看了这篇笔记后,我尝试自己用subprocess模块来处理一些文件操作,感觉确实比之前的方法更简便快速!对于脚本自动化来说是个不错的选择。

    有11位网友表示赞同!

Python学习笔记五:subprocess子进程模块
入骨相思

subprocess模块的使用场景好像很多啊,比如网络爬虫、自动化测试等等。这个模块学习起来难度是不是会比较大呢?希望后续笔记能深入讲解它的实际应用案例。

    有5位网友表示赞同!

Python学习笔记五:subprocess子进程模块
温柔腔

我觉得这篇笔记缺点就是代码示例太少啦!如果能添加一些更具体的应用例子,比如如何实时监控子进程的运行状态,我会受益更多。

    有13位网友表示赞同!

Python学习笔记五:subprocess子进程模块
一生荒唐

之前在学习subprocess模块的时候遇到过很多坑,尤其是错误处理的部分。希望以后的文章能针对一些常见问题进行详细解答!

    有15位网友表示赞同!

Python学习笔记五:subprocess子进程模块
有你,很幸福

学习Python是为了做数据分析和科学计算,感觉subprocess模块对我来说不是很实用。我希望博主能更多分享一些数据分析相关的知识点。

    有18位网友表示赞同!

Python学习笔记五:subprocess子进程模块
▼遗忘那段似水年华

subprocess 模块对系统资源的占用比较大吗?我需要在嵌入式设备上使用它,要注意内存和性能问题

    有7位网友表示赞同!

Python学习笔记五:subprocess子进程模块
←极§速

这个模块学习起来感觉有点抽象,需要多加练习才能真正掌握。希望可以多看一些实际应用案例,深入了解其用法。

    有15位网友表示赞同!

Python学习笔记五:subprocess子进程模块
素婉纤尘

之前我一直用shell脚本来完成一些自动化任务,现在终于了解到subprocess模块更适合python环境下调用外部命令了!这篇笔记讲的特别详细,我受益匪浅!

    有14位网友表示赞同!

Python学习笔记五:subprocess子进程模块
ゞ香草可樂ゞ草莓布丁

我认为这篇文章标题有点单调,可以考虑换个更吸引眼球的标题,比如 “Python子进程模块:从入门到精通” 或者 "用subprocess轻松搞定自动化脚本"

    有14位网友表示赞同!

Python学习笔记五:subprocess子进程模块
眼角有泪°

subprocess 模块真强大!它几乎涵盖了我想要的所有外部命令调用需求。我现在想学习一些更高级的使用技巧,比如如何处理复杂的任务流程和多进程协作

    有12位网友表示赞同!

Python学习笔记五:subprocess子进程模块
算了吧

作为一名Python爱好者,我一直关注这个模块的发展。这篇笔记让我了解到subprocess的最新用法,对于我的日常开发很有帮助。

    有20位网友表示赞同!

Python学习笔记五:subprocess子进程模块
|赤;焰﹏゛

这篇文章没有提到一些常用的参数,比如说超时设置、标准输出重定向等。我希望博主可以在后续的文章中详细讲解这些实用技巧!

    有20位网友表示赞同!

Python学习笔记五:subprocess子进程模块
青瓷清茶倾城歌

我觉得这篇文章写作思路清晰,逻辑表达很流畅。我很容易理解其中的概念和用法,对学习subprocess模块起到了很大的帮助

    有17位网友表示赞同!

Python学习笔记五:subprocess子进程模块
心脏偷懒

我建议增加一些案例分析,比如如何用 subprocess 处理网页爬取或数据下载等任务。这样能更直观地展示这个模块的应用价值!

    有13位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/127198.html

(0)
小su的头像小su
上一篇 2024年9月1日 下午10:34
下一篇 2024年9月1日 下午10:37

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注