Python子流程。Popen例子

Python子进程是有用的模块之一,用于运行不同的shell命令、进程,并使用Python脚本执行另一个脚本或可执行文件。它还可用于将数据从一个进程重定向到另一个进程,并处理由子进程生成的错误。子流程模块有许多用于各种目的的类。“子流程。类是该模块的类之一,用于与外部流程交互,并在流程之间执行不同类型的任务。“子流程”的多次使用。类Popen的Python脚本在本教程中展示。

内容主题:

  1. 运行一个简单的Linux命令
  2. 运行带有输入数据的命令
  3. 运行Python脚本
  4. 处理子进程错误
  5. 返回子进程的代码。Popen
  6. 将子流程的输出重定向到File
  7. 使用子进程进行多处理。Popen
  8. 处理输入和输出流
  9. 控制超时和延迟
  10. 读取流输入

运行一个简单的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用户了解该函数的基本用法。