其实Python内置模块subprocess模块创建和管理子进程的问题并不复杂,但是又很多的朋友都不太了解,因此呢,今天小编就来为大家分享Python内置模块subprocess模块创建和管理子进程的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
使用subprocess 模块,您可以执行外部命令、调用其他可执行文件并在Python 程序中与它们交互。这使您可以利用Python 的强大功能来自动化和控制其他程序的执行。
2. subprocess.Popen函数,启动一个新的子进程并与之交互
popen=subprocess.Popen(args,process_group=None):创建popen对象args:要执行的命令,可以是字符串或字符串列表。如果它是字符串列表,则每个元素将作为单独的参数传递给命令。 bufsize:用于指定缓冲区的大小。默认值为-1,表示使用系统默认的缓冲区大小。 executable:用于指定要执行的可执行文件的路径。默认为None,表示使用系统默认的可执行文件搜索规则。 stdin、stdout、stderr:这些参数用于指定子进程的标准输入、标准输出和标准错误的管道。它们可以是文件对象、文件描述符或subprocess.PIPE(用于创建新管道)。 preexec_fn:在子进程执行之前调用的可调用对象。可用于设置子进程的环境、文件描述符等。 close_fds:一个布尔值,指定是否关闭子进程中不必要的文件描述符。默认值为True,这意味着关闭不必要的文件描述符。 shell:一个布尔值,指定是否通过系统的shell执行命令。默认为False,表示不使用shell直接执行命令。 cwd:用于指定子进程的当前工作目录。 env:用于指定子进程的环境变量的字典。默认为None,表示继承当前进程的环境变量。 universal_newlines:一个布尔值,指定输入/输出数据是否作为文本处理并使用通用换行模式。默认为None,即根据系统平台自动选择是否以文本模式处理。 startupinfo:subprocess.STARTUPINFO对象,用于指定子进程的启动信息。 creationflags:一个整数,指定创建子进程的标志。默认为0,表示使用默认标志。 Restore_signals:一个布尔值,指定是否恢复子进程中的信号处理程序。默认为True,这会恢复信号处理程序。 start_new_session:一个布尔值,用于指定是否在子进程中启动新会话。默认为False,表示不启动新会话。 pass_fds:指定要在子进程中保持打开状态的文件描述符的整数列表。 coding、errors、text:这些参数用于指定文本数据的编码和错误处理。它们是在Python 3 中引入的,作为universal_newlines 参数的替代品。 umask:一个整数,指定子进程的文件模式创建掩码。默认为-1,表示使用当前进程的掩码。 Pipesize:指定管道大小的整数。默认为-1,表示使用系统默认的管道大小。 process_group:一个整数,指定子进程的进程组ID。 popen.poll():用于检查子进程(命令)是否执行完毕。如果未完成则返回None,完成后返回状态码。 popen.wait(timeout=None):等待子进程结束并返回状态码;如果在timeout 指定的秒数之后进程仍未结束,则会抛出TimeoutExpired 异常。 popen.communicate(input=None, timeout=None):该方法可用于与进程交互,例如向stdin发送数据,从stdout和stderr读取数据,直到到达文件末尾。 popen.send_signal(signal):发送指定的信号到该子进程。 popen.terminate():停止子进程。 popen.kill():杀死子进程。 popen.stdin:如果创建Popen对象时stdin参数设置为PIPE,Popen.stdin将返回一个文件对象供子进程发送指令。否则,不返回任何内容。
popen.stdout:如果在创建Popen对象时将stdout参数设置为PIPE,则Popen.stdout将返回一个文件对象,用于向子进程发送指令。否则,不返回任何内容。 popen.stderr:如果创建Popen对象时stdout参数设置为PIPE,Popen.stdout将返回一个文件对象,用于向子进程发送指令。否则,不返回任何内容。 popen.pid:获取子进程的进程ID。 popen.returncode:获取进程的返回值。如果进程尚未结束,则返回None。 popen.args:获取传递给Popen的命令参数。 popen.universal_newlines:布尔值,指示是否以文本模式处理输入/输出数据并使用通用换行符模式。如果创建Popen 对象时指定了universal_newlines=True,则popen.universal_newlines 将为True。 3. subprocess模块中常用的功能均基于subprocess.Popen实现。
subprocess.run(*popenargs, input=None, capture_output=False, timeout=None, check=False, **kwargs):执行指定的命令,等待命令完成,并返回一个包含命令信息的CompletedProcess对象执行,例如返回码、标准输出和标准错误输出。 popenargs:要执行的命令及其参数,可以是字符串或字符串列表。 input:用于发送给子进程的输入。它可以是一个字节字符串。 capture_output:一个布尔值,用于指定是否捕获子进程的标准输出和标准错误输出。 timeout:可选超时,指定等待命令完成的最长时间。 check:一个布尔值,指定是否检查命令的返回码并在返回码非零时引发异常。 **kwargs:传递给subprocess.Popen 构造函数的附加关键字参数。 subprocess.call(*popenargs, timeout=None, **kwargs):执行指定的命令,等待命令完成,并返回命令的返回码。 popenargs:要执行的命令及其参数,可以是字符串或字符串列表。 timeout:可选超时,指定等待命令完成的最长时间。 **kwargs:传递给subprocess.Popen 构造函数的附加关键字参数。 subprocess.check_call(*popenargs, **kwargs):执行指定的命令并等待命令完成。如果命令的返回码非零,则会引发CalledProcessError 异常。 popenargs:要执行的命令及其参数,可以是字符串或字符串列表。 **kwargs:传递给subprocess.Popen 构造函数的附加关键字参数。 subprocess.check_output(*popenargs, timeout=None, **kwargs):执行指定的命令,等待命令完成,并返回命令的输出。 popenargs:要执行的命令及其参数,可以是字符串或字符串列表。 timeout:可选超时,指定等待命令完成的最长时间。 **kwargs:传递给subprocess.Popen 构造函数的附加关键字参数。 subprocess.getoutput(cmd,*,encoding=None,errors=None):执行指定的命令并将命令的输出作为字符串返回。 cmd:要执行的命令。编码:用于解码命令输出的字符编码。错误:用于指定解码命令输出时的错误处理。 subprocess.getoutput() function subprocess.getstatusoutput(cmd, *,coding=None,errors=None):执行指定的命令,并返回一个包含命令的返回码和输出结果的元组。 cmd:要执行的命令。编码:用于解码命令输出的字符编码。错误:用于指定解码命令输出时的错误处理。 subprocess.list2cmdline(seq):将字符串序列转换为表示命令行参数的单个字符串。它使用依赖于操作系统的规则来转义和引用参数。 seq:字符串序列。 4.解决输入输出报表编码错误的bug
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/127258.html
用户评论
凝残月
终于找到这篇文章了!我最近一直在学习Python,想弄懂如何使用subprocess这个模块来管理子进程,感觉教程不多,这篇写的特别细致,通俗易懂,受益匪浅啊。
有18位网友表示赞同!
眼角有泪°
python的内置模块真的太强大啦!subprocess模块能轻松创建和管理子进程,解放了开发者的双手。之前自己写shell脚本就经常耗费大量时间,现在用Python代码直接处理就好了!
有18位网友表示赞同!
莫飞霜
我觉得这篇博客讲解挺深入的,从基础概念到常用函数都介绍了,连一些小细节我也学会了。比如启动参数和管道流的使用方法,以前总是搞不懂的。
有12位网友表示赞同!
来瓶年的冰泉
写得不错啊,我就是想学python执行shell命令,没想到subprocess这么简单操作!以后不用再担心乱码问题了,python真是我心目中的编程语言之神!
有19位网友表示赞同!
醉枫染墨
这篇文章只是讲了原理,没有实际代码案例,感觉有点理论性强,希望后面能补充一些实战应用场景,这样更直观理解。
有11位网友表示赞同!
男神大妈
学习Python 感觉subprocess模块确实很有用处,但是文档上写的太复杂了,这篇博文解释的非常清晰易懂,谢谢作者!
有12位网友表示赞同!
■□丶一切都无所谓
我平时开发要用到shell命令,subprocess这个模块确实很方便,以前写代码的时候手动拼接命令字符串感觉很危险和繁琐,现在用这个模块可以避免这些问题。
有19位网友表示赞同!
万象皆为过客
看了这篇文章之后感觉subprocess模块用的频率越来越高了,各种应用场景都能用到,感觉Python真是一门非常强大的语言,能解决很多实际问题!
有7位网友表示赞同!
执念,爱
这篇博文讲解了很多参数的用法,例如Popen对象的一些属性、状态查询等,这些信息对于想要熟练掌握subprocess模块还是非常有用的。
有10位网友表示赞同!
一生荒唐
学习使用PYTHON subprocess 模块来管理子进程需要一些时间和耐心,但只要理解了原理,就很容易上手。这篇博文讲解的很详细,很适合新手入门学习!
有7位网友表示赞同!
裸睡の鱼
我觉得文章有点重复,之前网上也有很多关于subprocess模块的教程,而且内容也比较丰富,这篇博文的深度不够深。
有17位网友表示赞同!
仰望幸福
用Python执行shell命令可以用other的方式吗? subprocess 感觉太low了。想听听大神们的建议!
有10位网友表示赞同!
仅有的余温
学习python 真的很辛苦,好多东西都理解不了!比如“创建子进程”是什么意思?这个博客解释得不太清楚啊!
有14位网友表示赞同!
寂莫
Python内置模块subprocess真的太方便啦!之前还用过其他第三方库,但还是subprocess效率更高,文档也更好用。
有17位网友表示赞同!
颓废人士
这篇文章好短啊,只讲了几个常用函数,subprocess里的其他功能呢?希望作者能把这篇博文完善一些。
有15位网友表示赞同!
。婞褔vīp
感觉这个博客标题有点夸张了,"创建和管理子进程" 都是基础操作,这种简单的内容应该不应该单独做一篇博文吧!
有7位网友表示赞同!
冷嘲热讽i
刚开始学Python就遇到subprocess模块,太难理解了!希望作者能用通俗的语言解释一下,加一些代码实例,这样我才能更好地学习。
有16位网友表示赞同!
花菲
subprocess模块确实很强大,可以用来执行各种命令,包括远程执行和脚本自动化等。这本书介绍得不错,希望能学到更多先进的使用方法
有11位网友表示赞同!