欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python实现批处理--subprocess模块的使用

程序员文章站 2022-03-11 22:56:24
python实现批处理subprocess模块的使用python调用exe文件...


一般提到写批处理大家都会想到windows下的bat以及linux下的shell等实现批处理文件的编写。但是bat和shell命令太复杂,可以使用python替代bat写批处理。

1.为什么需要批处理

假设你有一个exe文件需要反复运行,那么你怎样才可以做到像c++等编程语言对一个变量进行不断自加一样简单实现反复运行呢,这时候你就要用到批处理了。

2.subprocess库中常用的封装函数

Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.systemos.spawnos.popenpopen2.commands.不但可以调用外部的命令作为子进程,而且可以连接到子进程的input/output/error管道,获取相关的返回信息。
注:以下代码均在window下的python3.7.4版本下实现,如果出现缺少库的情况,请使用 pip install XX 安装需要的库。

subprocess.call()

父进程等待子进程完成,返回退出信息

#父进程等待子进程完成
subprocess.call   	#call 系列 都是等待命令执行完
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None)
#参数含义
args    #该参数用于启动进程。这可能是一个列表或一个字符串。
returncode   #该参数表示子进程的退出状态。通常情况下,0作为退出状态表明它成功运行。负值-N表明子进程被信号N终止(仅POSIX)。
stdout  #该参数表示标准输出
stderr	#该参数表示标准错误

一个例子教你怎么使用call函数

subprocess.call("encode.exe",stdout=open('out.txt', 'a'), stderr=open('err.txt', 'a'))

其中encode.exe是你要运行的可执行文件,out.txt是你存放输出信息的位置,err.txt是你存放错误信息的位置。

subprocess.run()

父进程等待子进程完成

#父进程等待子进程完成
subprocess.call		#执行指定的命令,等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例。
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False)
#参数含义
args    #该参数用于启动进程。这可能是一个列表或一个字符串。
returncode   #该参数表示子进程的退出状态。通常情况下,0作为退出状态表明它成功运行。负值-N表明子进程被信号N终止(仅POSIX)。
stdout  #该参数表示标准输出
stderr	#该参数表示标准错误

subprocess.Popen()

class Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
#参数含义
args    #该参数用于启动进程。这可能是一个列表或一个字符串。
returncode   #该参数表示子进程的退出状态。通常情况下,0作为退出状态表明它成功运行。负值-N表明子进程被信号N终止(仅POSIX)。
stdout  #该参数表示标准输出
stderr	#该参数表示标准错误

一个例子见博客

3.一个完整的python项目实现AVS_PCC的批处理

下面的python代码可以对AVS_PCC的Cat1序列进行批处理,将输出的编解码信息以及失真信息按文件名输出到txt文档中。里面有详细的解释,基本上看注释就能看懂每条语句的用处,如果看代码还有不懂的地方可以在下面留言,博主看到后将尽快回复。


import os,sys,subprocess
plyPath=r'E:\\AVS\\AVS_data\\hd_map_1mm\\'
plyName=['bridge_1mm','double_T_section_1mm','intersection1_1mm','intersection2_1mm','straight_road_1mm','T_section_1mm']
#EXE=['0','1']
EXE=['0']
CTC=['C1','C2','C3','C4']
curPath = os.getcwd()#获取当前路径
# print(curPath)
for ctc in CTC:
	if ctc == 'C1':
		#下面是cat1的C1部分
		QSQPC1=[['512','48'],['256','40'],['64','32'],['32','24'],['8','16'],['4','8']]#这里是几何步长和属性步长组成的二维数组
		for ply_name in plyName:
			for e in EXE:
				fileName = curPath+'\\C1_'+ply_name+'_'+e+'.txt'
				#删除已经存在的文件
				if os.path.exists(fileName): 
					os.remove(fileName)#删除已经存在的文件
				for	qsqp in QSQPC1:		
					command1=e+'_encoder.exe'+' -c encode.cfg --input '+plyPath+ply_name+'.ply -ctf 1 -grdf 1 --geom_quant_step '+qsqp[0]+' --attr_quant_param '+qsqp[1]
					subprocess.call(command1,stdout=open('C1_'+ply_name+'_'+e+'.txt', 'a'), stderr=open('err.txt', 'a'))
	elif ctc == 'C2':			
		#下面是cat1的C2部分	
		Quant_stepC2=['48','40','32','24','16','8']	
		for ply_name in plyName:
			for qs in Quant_stepC2:
				for e in EXE:
					fileName = curPath+'\\C2_'+ply_name+'_'+e+'.txt'
					#删除已经存在的文件
					if os.path.exists(fileName): 
						os.remove(fileName) 
					command1=e+'_encoder.exe'+' -c encode.cfg --input '+plyPath+ply_name+'.ply -ctf 1 --attr_quant_param '+qs
					subprocess.call(command1,stdout=open('C2_'+ply_name+'_'+e+'.txt', 'a'), stderr=open('err.txt', 'a'))
	elif ctc == 'C3':					
		#下面是cat1的C3部分
		Quant_stepC3=['40','32','24','16','8']
		for ply_name in plyName:
			for qs in Quant_stepC3:
				for e in EXE:
					fileName = curPath+'\\C3_'+ply_name+'_'+e+'.txt'
					#删除已经存在的文件
					if os.path.exists(fileName): 
						os.remove(fileName) 
					command1=e+'_encoder.exe'+' -c encode.cfg --input '+plyPath+ply_name+'.ply --attr_quant_param '+qs
					subprocess.call(command1,stdout=open('C3_'+ply_name+'_'+e+'.txt', 'a'), stderr=open('err.txt', 'a'))
	elif ctc == 'C4':		
		#下面是cat1的C4部分
		for ply_name in plyName:
			for e in EXE:
				fileName = curPath+'\\C4_'+ply_name+'_'+e+'.txt'
				#删除已经存在的文件
				if os.path.exists(fileName): 
					os.remove(fileName) 
				command1=e+'_encoder.exe'+' -c encode.cfg --input '+plyPath+ply_name+'.ply'
				subprocess.call(command1,stdout=open('C4_'+ply_name+'_'+e+'.txt', 'a'), stderr=open('err.txt', 'a'))
		
		
		
		

本文地址:https://blog.csdn.net/weixin_43373833/article/details/107646214

相关标签: python 多进程