Python subprocess子进程模块生成新进程并获取其返回码

Python subprocess子进程模块生成新进程并获取其返回码

Python子进程模块提供了简单的功能,这些功能使我们可以生成新进程并获取其返回码。该模块是Python v2.4中引入的。

在本课程中,我们将研究该subprocess模块可用的各种功能以及如何使用它们。

Python子进程

Python子进程模块是一个功能强大的工具,被引入以替换Python中存在的各种旧模块/函数,例如:

  • os.system
  • os.spawn and related functions
  • os.popen and related functions
  • popen2.*
  • commands.*

请注意,替换不是按原样进行的,需要对程序进行一些修改才能转移到subprocess模块的用法。让我们从该模块的功能开始我们的旅程。

Python子进程call()

此函数用于运行命令并获取命令的返回码。让我们快速看一下示例代码片段:

 

import subprocess

print(subprocess.call(["pwd", "-P"]))

输出将是:

让我们了解一下上面程序中发生了什么:

  • 传递参数列表时,第一个参数将解释为可执行文件。
  • 从第二个参数开始的参数将被视为程序的命令行参数。
  • 我们也可以这样做:

 

import subprocess

print(subprocess.call('ls -l', shell=True))

在shell为True的情况下,call()函数将其完全视为命令并按原样运行。输出将显示当前文件夹中的所有文件和目录。

请注意,在基于POSIX的系统中,返回码0表示成功,而1到255表示其他任何东西。这些退出代码由机器脚本解释,以评估成功和失败的事件。

Python子进程run()

该函数的工作方式与call方法类似,用于运行命令并获取命令的返回码。让我们快速看一下示例代码片段:

 

import subprocess

print(subprocess.run(["pwd", "-P"]))

输出将是:

请注意,该run()函数是在Python 3.5中添加的。run()与call()函数之间的明显区别是该call()函数不支持输入和检查参数。

Python子进程check_call()

此函数的功能类似于call()函数,但是如果运行指定的命令时出错,则会引发CalledProcessError异常。让我们快速看一下示例代码片段:

 

import subprocess

print(subprocess.check_call("false"))

输出将是:

我们使用该false命令,因为它总是返回错误返回码。

Python子进程check_output()

当我们使用该call()函数运行命令时,输出绑定到父进程,并且对于调用程序是不可检索的。我们可以使用该check_output()函数捕获输出以供以后使用。让我们快速看一下示例代码片段:

 

import subprocess

output = subprocess.check_output(['ls', '-1'])

print("Output is {} bytes long.".format(len(output)))

输出将是:

Python子进程communication()

我们可以communicate()在此Python模块中使用该函数来读取输入和输出,以形成进程本身。stdout是过程输出,并stderr在发生错误时填充。让我们快速看一下示例代码片段:

 

import subprocess

process = subprocess.Popen(

    ['cat', 'hello.py'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

stdout, stderr = process.communicate()

print(stdout)

输出将是:

请注意,我们有一个hello.py只说的脚本print("Hello")。

Python子进程Popen

Python子进程Popen用于在新进程中执行子程序。我们可以使用它来运行一些shell命令。让我们通过简单的示例程序来了解Popen的用法。

 

import subprocess

 

process = subprocess.Popen(['ls', '-ltr'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

 

print(process.communicate())

 

process = subprocess.Popen(['echo', 'Pankaj'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=None)

 

print(process.communicate())

 

process = subprocess.Popen(['ping', '-c 1', 'journaldev.com'], stdout=subprocess.PIPE)

 

print(process.communicate())

执行时,将产生以下输出。

 

(b'total 8\n-rw-r--r--  1 pankaj  staff  396 Dec  9 22:00 subprocess_popen.py\n', b'')

(b'Pankaj\n', b'')

(b'PING journaldev.com (209.124.77.163): 56 data bytes\n64 bytes from 209.124.77.163: icmp_seq=0 ttl=53 time=474.153 ms\n\n--- journaldev.com ping statistics ---\n1 packets transmitted, 1 packets received, 0.0% packet loss\nround-trip min/avg/max/stddev = 474.153/474.153/474.153/0.000 ms\n', None)

在本课程中,我们学习了Python子进程模块提供的各种功能,并了解了它们如何工作。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值