Python子流程。Popen例子
Python子进程是有用的模块之一,用于运行不同的shell命令、进程,并使用Python脚本执行另一个脚本或可执行文件。它还可用于将数据从一个进程重定向到另一个进程,并处理由子进程生成的错误。子流程模块有许多用于各种目的的类。“子流程。类是该模块的类之一,用于与外部流程交互,并在流程之间执行不同类型的任务。“子流程”的多次使用。类Popen的Python脚本在本教程中展示。
内容主题:
- 运行一个简单的Linux命令
- 运行带有输入数据的命令
- 运行Python脚本
- 处理子进程错误
- 返回子进程的代码。Popen
- 将子流程的输出重定向到File
- 使用子进程进行多处理。Popen
- 处理输入和输出流
- 控制超时和延迟
- 读取流输入
运行一个简单的Linux命令
date命令用于显示当前系统日期和时间。用下面的脚本创建一个Python文件,创建一个执行" date "命令的子进程,并打印该命令的输出:
#导入模块
导入子流程
为子进程和定义一个命令
#使用Popen()函数打开进程
输出=子进程。Popen(“日期”,stdout = subprocess.PIPE)
#通过与进程通信获取输出和错误
Stdout, stderr = output. communication ()
#打印输出
print (stdout.decode ())
输出:
执行上述脚本后,显示如下:
到顶部
运行带有输入数据的命令
带-c选项的wc命令用于计算该命令提供的字符串值的总字符数。使用以下脚本创建一个Python文件,该文件使用Popen()函数创建一个子进程,以运行" wc -c "命令。执行脚本后从终端获取字符串值,并在输出中打印输入字符串的总字符。
#导入模块
导入子流程
为子进程和定义一个命令
#使用Popen()函数打开进程
输出=子进程。Popen(["wc", "-c"], stdout=subprocess.PIPE)
#通过与进程通信获取输出和错误
Stdout, stderr = output. communication ()
#打印输出
print (stdout.decode ())
输出:
" Python Subprocess Examples "输入值显示如下输出:
到顶部
运行Python脚本
使用以下脚本创建一个名为" sum.py "的Python文件,计算两个数字的和,这些数字作为命令行参数提供:
sum.py
#导入必要模块
导入系统
#计算参数总数
N = len(sys.argv)
#添加前两个参数值
Sum = int(sys.argv[1]) + int(sys.argv[2])
#打印加法结果
print("The sum of " + sys。Argv[1] + "和" + sys。Argv [2] + " is", sum)
使用以下脚本创建一个Python文件,该脚本将通过创建子进程运行一个名为sum.py的Python文件,该文件带有两个参数。
#导入模块
导入子流程
#在子进程中运行python脚本
#使用Popen()函数打开进程
输出=子进程。Popen(["python3", "sum.py", "25", "55"], stdout=subprocess.PIPE)#通过与进程通信获取输出和错误
Stdout, stderr = output. communication ()
#打印输出
print (stdout.decode ())
输出:
执行上述脚本后,显示如下:
到顶部
`
处理子进程错误
使用以下脚本创建一个Python文件,该文件使用" try-except "块处理子进程的错误。从用户处获取命令,并由子进程执行。如果从用户处获取任何无效的命令,则返回错误消息。
#导入模块
导入子流程
导入系统
#接受用户的命令
command = input("输入一个有效的命令:")
试一试:
#使用Popen()函数打开进程
输出=子进程。Popen((命令),stdout = subprocess.PIPE)
#通过与进程通信获取输出和错误
Stdout, stderr = output. communication ()
#打印输出
print (stdout.decode ())
除了:
print ("Error:", sys.exc_info())
输出:
如果输入的是有效命令“pwd”,则显示如下:
如果输入usr命令为有效命令,则显示如下:
到顶部
返回子进程的代码。Popen
使用以下脚本创建一个Python文件,该脚本通过子进程执行" ls "命令以从当前位置获取所有Python文件的列表。脚本等待完成子进程并打印返回代码。
#导入模块
导入子流程
导入系统
#设置命令
Command = ['ls', '-l', '*.py']
试一试:
#使用Popen()函数打开进程
输出=子进程。Popen(命令,stdout =子流程。管,
stderr =子流程。管、文本= True)
#等待进程完成
retCode = output.wait()
#打印返回码
print("Return Code:", retCode)
除了:
#打印错误信息
print ("Error:", sys.exc_info())
输出:
在执行前面的脚本后出现类似的输出:
到顶部
将子流程的输出重定向到File
使用以下脚本创建一个Python文件,将子进程的输出写入文本文件。子进程执行的命令取自用户。
#导入模块
导入子流程
#定义文件名
Filename = "outfile.txt"
#使用ping命令
cmd = input("输入ping命令:")
#根据空格分割输入
Args = cmd.split()
#将命令输出写入文件
使用open(filename, 'w')作为outdata:
process = subprocess.Popen(args,stdout=outdata)
#等待进程完成
Return_code = process.wait()
输出:
如下所示,从用户处获取“ping -c 3 www.google.com”命令,使用“cat”命令显示子进程写入的文件内容:
到顶部
使用子进程进行多处理。Popen
使用以下脚本创建一个Python文件,其中使用subprocess显示了多处理的使用。这里,使用multiprocessing多次调用名为display_msg()的函数。
#导入必要的模块
进口多处理
导入子流程
定义将被multiprocessing调用的函数
def display_msg (n):
#使用format()函数定义命令
cmd = "echo 'Python Programming'".format(n)
#使用Popen()函数打开进程
Process =子进程。Popen(cmd, shell=True, stdout=subprocess.PIPE)
#通过与进程通信获取输出和错误
Stdout, error = process. communication ()
#打印输出
print (stdout.decode ())
#通过创建multiprocessing调用该函数5次池
使用multiprocessing.Pool(multiprocessing.cpu_count())作为mp:
#映射函数
mp。Map (display_msg, range(1, 5))
输出:
执行上述脚本后,显示如下:
到顶部
处理输入和输出流
在创建本例的Python脚本之前,使用以下内容创建一个名为" test.txt "的文本文件。
用法
PERL
python
bash
php
使用以下脚本创建一个Python文件,该脚本使用一个子进程读取" test.txt "文件的内容,并使用另一个子进程在该文本文件中搜索特定的单词。这里,“python”这个词是在包含这个词的“test.txt文件”中搜索的。
#导入模块
导入子流程
为输入流定义一个进程
In_process =子进程。Popen(["cat", "test.txt"], stdout=subprocess。PIPE, text=Tru>#为输出流定义一个进程
Out_process =子进程。Popen (
["grep", "python"], stdin=in_process.stdout,
stdout =子流程。管、文本= True)
#存储输入和输出过程的输出
输出,_ = out_process. communication ()
#打印输出
打印("输出:",输出)
输出:
执行脚本后显示如下:
到顶部
使用定时器控制子进程
用下面的脚本创建一个Python文件,该脚本使用计时器来使用子进程执行命令。这里,“try-except”块用于启动计时器,“finally”块用于取消计时器。
#导入子进程模块
导入子流程
#导入定时器模块
从线程导入定时器
#定义命令
CMD = ['ping', 'www.example.com']
#打开进程
P =子进程。Popen (
cmd, stdout =子流程。管,stderr = subprocess.PIPE)
#定义定时器
timer = timer (2, lambda process: process.kill(), [p])
试一试:
#启动定时器
timer.start ()
#读输出
Stdout, _ = p. communication ()
#打印输出
print (stdout.decode ())
除了:
#打印错误信息
print ("Error:", sys.exc_info())
最后:
#停止计时器
timer.cancel ()
输出:
执行脚本后显示如下:
到顶部
读取流输入
创建一个Python文件,该文件使用" while "循环读取子进程输出的内容,并将内容存储到一个变量中。稍后将打印该变量的内容。这里,在www.google.com URL的子进程中使用“curl”命令。
#导入模块
导入子流程
#定义命令
CMD = ["curl", "www.example.com"]
P =子进程。Popen (cmd, stdout =子流程。管,
stderr =子流程。管、文本= True >
#初始化输出变量
输出= ""
而真正的:
#逐行读取进程输出
Ln = p.stdout.readline()
当子进程结束时终止循环
如果不是ln:
打破
输出=输出+ ln
#打印行
打印(输出)
#在完成流程后获取返回代码
Return_code = p.wait()
#打印返回码
print ("Return code: ", return_code)
输出:
三个输出的最后一部分如下图所示。完成子进程后返回码为0:
到顶部
结论
本教程使用多个Python脚本展示了Python subprocess.Popen()的不同用法,这些脚本将帮助Python用户了解该函数的基本用法。