Python子进程
Python子流程模块提供了简单的功能,这些功能使我们可以生成新流程并获取其返回代码。
该模块是Python v2.4中引入的。
在本程序中,我们将研究subprocess模块可使用的各种功能以及如何使用它们。
Python子进程
Python子进程模块是一个功能强大的工具,被引入以替换Python中存在的各种旧模块/函数,例如:
- os.system
- os.spawn和相关功能
- os.popen和相关功能
- popen2.*
- commands.*
请注意,替换不是按原样进行的,需要对程序进行一些修改才能移至subprocess
模块的用法。
让我们从该模块的功能开始我们的旅程。
Python子进程call()
此函数用于运行命令并获取命令的返回码。
让我们快速看一下示例代码片段:
import subprocess print(subprocess.call(["pwd", "-P"]))
让我们了解以上程序发生了什么:
传递参数列表时,第一个参数将解释为可执行文件。
从第二个参数开始的参数将被视为程序的命令行参数。
我们也可以这样做:
import subprocess print(subprocess.call('ls -l', shell=True))
With shell being True, call()
function treats this as command completely and run it as is. The output would have shown all files and directories in current folder.
请注意,在基于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()
我们可以在这个Python模块中使用communicate()
函数来读取输入和输出,以形成流程本身。
" 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', 'hyman'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=None) print(process.communicate()) process = subprocess.Popen(['ping', '-c 1', 'theitroad.local'], stdout=subprocess.PIPE) print(process.communicate())
执行时,将产生以下输出。
(b'total 8\n-rw-r--r-- 1 hyman staff 396 Dec 9 22:00 subprocess_popen.py\n', b'') (b'hyman\n', b'') (b'PING theitroad.local (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--- theitroad.local 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)