Python基础之subprocess
前言
subprocess这个函数很好用,类似于控制台执行,功能很多,今天先介绍subprocess调用exe,并行调用两个或两个以上的exe。
Subprocess调用exe
调用exe有几种方式,这里介绍一下subprocess。
p = subprocess.Popen(“./XXX.exe param1 param2”, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
返回值为p.returncode,exe中打印出来的消息为output= p.communicate()[0]
那么有的程序运行时特别耗资源,容易卡死,所以设置一个超时时间,如果在规定时间内可以分析完毕,返回分析结果,如果超时了,杀死exe,返回默认结果。
def Func():
p = subprocess.Popen("./XXX.exe", stdin=subprocess.PIPE, stdout=subprocess.PIPE)
try:
p.wait(timeout=SECONDS_TIMEOUT)
except Exception as e:
print("===== process timeout ======")
p.kill()
return None
output= p.communicate()[0]
err = p.communicate()[1]
print(output)
print(p.returncode)
Subprocess并行调用两个或两个以上的exe
方法一:多线程
知识点:多线程,路径分离,锁定程序运行路径
以并行调用三个exe为例。
1. readini.exe
功能:读取同级目录testini.ini里面的一个值,等待3秒,写入同级目录test1.ini里面
testini.ini
[TEST]
name = Sindy
age = 20
sex = girl
score = 90
2. rose.exe
功能:画一朵玫瑰花,大概运行8S。
3. Usage.exe
功能:画一个动态折线图,时间20S。
CallEXEParaller.py
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
"""=================================================
@Project -> File : 20200613 -> CallEXEParaller.py
@IDE : PyCharm
@Author : zihan
@Date : 2020/6/13 14:20
@Desc :目的:可以并行调用两个或者多个EXE
================================================="""
import subprocess
import sys
import os
import threading SECONDS_TIMEOUT = 1000 def execute_exe(exe_path, exe_param):
folder_path, file_name = os.path.split(exe_path)
# os.chdir(folder_path)
p = subprocess.Popen(exe_path + " " + exe_param, stdin=subprocess.PIPE, stdout=subprocess.PIPE, cwd=folder_path)
try:
p.wait(timeout=SECONDS_TIMEOUT)
except Exception as e:
p.kill()
# os.chdir(current_path)
print("===== process timeout ======")
return None
except:
s = sys.exc_info()
str_error = "Error '%s' happened on line %d" % (s[1], s[2].tb_lineno)
p.kill()
# os.chdir(current_path)
return None
# os.chdir(current_path)
output = p.communicate()[0]
err = p.communicate()[1]
print(output)
print(p.returncode) if __name__ == '__main__':
current_path = os.getcwd()
readini_abs_path = current_path + "\\" + r"EXEModule\ReadINI\readini.exe"
rose_abs_path = current_path + "\\" + r"EXEModule\Rose\rose.exe"
usage_abs_path = current_path + "\\" + r"EXEModule\CPUUsage\CPUUsage.exe"
t1 = threading.Thread(target=execute_exe, args=(readini_abs_path, ""))
t2 = threading.Thread(target=execute_exe, args=(rose_abs_path, ""))
t3 = threading.Thread(target=execute_exe, args=(usage_abs_path, ""))
t1.start()
t2.start()
t3.start()
注意subprocess的cwd参数,它可以指定当前exe运行在哪个路径下。程序中执行的就是如果调用哪个exe,那么就在exe所在的目录下执行程序。
方法二:多进程
在用多线程运行时发现了一个问题,如果在exe运行完后要作出相应的操作,那么必须得耗时最长的程序运行完后,在一起打印消息。这是因为p.communicate()[0]在阻塞的原因。解决此问题的方法就是用多线程进行调用。
CallEXEParallel.py
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
"""=================================================
@Project -> File : 20200613 -> CallEXEParaller.py
@IDE : PyCharm
@Author : zihan
@Date : 2020/6/13 14:20
@Desc :目的:可以并行调用两个或者多个EXE
方法一:多进程方法调用,完美实现
方法二:多线程调用,因为有p.communicate()[0]的存在,会导致打印阻塞,一直等到耗时长的程序执行完才会打印消息
================================================="""
import subprocess
import sys
import os
import threading
import multiprocessing def execute_exe(exe_path, exe_param):
print("aaa")
folder_path, file_name = os.path.split(exe_path)
try:
p = subprocess.Popen(exe_path + " " + exe_param, stdin=subprocess.PIPE, stdout=subprocess.PIPE, cwd=folder_path)
except:
s = sys.exc_info()
str_error = "Error '%s' happened on line %d" % (s[1], s[2].tb_lineno)
print(str_error)
return None
output = p.communicate()[0]
err = p.communicate()[1]
print(output)
print(p.returncode)
if p.returncode == 0:
print("pass")
else:
print("fail") # 方法一:多进程方法调用
def multiprocess_test():
current_path = os.getcwd()
readini_abs_path = current_path + "\\" + r"EXEModule\ReadINI\readini.exe"
rose_abs_path = current_path + "\\" + r"EXEModule\Rose\rose.exe"
usage_abs_path = current_path + "\\" + r"EXEModule\CPUUsage\CPUUsage.exe" p1 = multiprocessing.Process(target=execute_exe, args=(readini_abs_path, ""))
p1.start()
p2 = multiprocessing.Process(target=execute_exe, args=(rose_abs_path, ""))
p2.start()
p3 = multiprocessing.Process(target=execute_exe, args=(usage_abs_path, ""))
p3.start() p1.join()
p2.join()
p3.join() # 方法二:多线程方法调用
def threading_test():
current_path = os.getcwd()
readini_abs_path = current_path + "\\" + r"EXEModule\ReadINI\readini.exe"
rose_abs_path = current_path + "\\" + r"EXEModule\Rose\rose.exe"
usage_abs_path = current_path + "\\" + r"EXEModule\CPUUsage\CPUUsage.exe" t1 = threading.Thread(target=execute_exe, args=(readini_abs_path, ""))
t2 = threading.Thread(target=execute_exe, args=(rose_abs_path, ""))
t3 = threading.Thread(target=execute_exe, args=(usage_abs_path, "")) t1.start()
t2.start()
t3.start() t1.join()
t2.join()
t3.join() if __name__ == '__main__':
# threading_test()
multiprocess_test()
OK.
Python基础之subprocess的更多相关文章
- python基础教程
转自:http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html Python快速教程 作者:Vamei 出处:http://www.cn ...
- Python 基础之socket编程(二)
Python 基础之socket编程(二) 昨天只是对socket编程做了简单的介绍,只是把socket通信的框架搭建起来,要对其中的功能进行进一步的扩充,就来看看今天的料哈! 一.基于tcp的套接字 ...
- Python基础-week05
本节大纲:Author:http://www.cnblogs.com/Jame-mei 模块介绍 time & datetime模块 random os sys shutil json &am ...
- python基础之socket编程 (转自林海峰老师)
python基础之socket编程 阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 ...
- python基础系列教程——Python3.x标准模块库目录
python基础系列教程——Python3.x标准模块库目录 文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata ...
- python基础 — 致初学者的天梯
Python简介 Python是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新 功能的添加,越来越多被用于独立的.大型项目 ...
- python基础31[常用模块介绍]
python基础31[常用模块介绍] python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的li ...
- (Python基础教程之二十二)爬虫下载网页视频(video blob)
Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...
- python之最强王者(2)——python基础语法
背景介绍:由于本人一直做java开发,也是从txt开始写hello,world,使用javac命令编译,一直到使用myeclipse,其中的道理和辛酸都懂(请容许我擦干眼角的泪水),所以对于pytho ...
随机推荐
- 可微渲染 SoftRas 实践
SoftRas 是目前主流三角网格可微渲染器之一. 可微渲染通过计算渲染过程的导数,使得从单张图片学习三维结构逐渐成为现实.可微渲染目前被广泛地应用于三维重建,特别是人体重建.人脸重建和三维属性估计等 ...
- Django(67)drf搜索过滤和排序过滤
前言 当我们需要对后台的数据进行过滤的时候,drf有两种,搜索过滤和排序过滤. 搜索过滤:比如我们想返回sex=1的,那么我们就可以从所有数据中进行筛选 排序过滤:比如我们想对价格进行升序排列,就可以 ...
- java面试技巧及层次。
不断的积累,从打算找工作之日起,就要坚持在每天闲暇之余学习其中几道题目,日积月累,等到出去面试时,一切都水到渠成,面试时就自然会游刃有余了. 答题时,先答是什么,再答有什么作用和要注意什么,这里给人的 ...
- 基于ABP落地领域驱动设计-03.仓储和规约最佳实践和原则
目录 系列文章 仓储 仓储的通用原则 仓储中不包含领域逻辑 规约 在实体中使用规约 在仓储中使用规约 组合规约 学习帮助 围绕DDD和ABP Framework两个核心技术,后面还会陆续发布核心构件实 ...
- 微信订阅号中获取openid以及个人信息
采用的方式是利用另一个服务号获取用户信息. 其中有一个问题就是不关注这个服务号获取不了用户头像等信息.
- vue elementui table 内按钮跳转页面
vue : <el-table-column label="操作" v-if="isColumOperate"> <template slot ...
- CosId 1.1.8 发布,通用、灵活、高性能的分布式 ID 生成器
CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式 ID 生成器. 目前提供了三类 ID 生成器: SnowflakeId : 单机 TPS 性 ...
- Centos 8 上定时备份Gitlab ,脚本实现定时备份,备份恢复
定时备份 要求 为了能够备份和恢复,请确保你的系统上安装了Rsync yum install rsync -y 配置备份目标机器免密认证 执行ssh-keygen -t rsa 生成私钥和公钥 ssh ...
- acwing 4 多重背包问题 I
多重背包 有 n种物品 一共有 m大小的背包,每种物品的价值 大小 个数 为 s[i],v[i],num[i]; #include<bits/stdc++.h>//cmhao #defin ...
- 初入web前端---实习(职场菜鹏)
作为一个大四的准职场新人,顺利的找到了一份自己想从事的工作---web前端开发.