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 ...
随机推荐
- APP的闪退和无响应
1.app闪退(crash,崩溃):程序异常退出不再运行 闪退的原因: a.程序内部逻辑错误(因算法或网络连接引起的异常,或是为捕捉到的错误) b.系统自身异常:一般自定ROM或刷机后比较常见 c.运 ...
- Centos7 安装 Zabbix Server 4.0
官方参考URL:https://www.zabbix.com/documentation/4.0/start 1. 安装 Apache 2.4(略) 注意系统时间/时区ntp server是否定时同步 ...
- 在centos上安装docker
安装docker 卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docke ...
- 好用的Java工具类库,GitHub星标10k+你在用吗?
简介 Hutool是Hu + tool的自造词,前者致敬我的"前任公司",后者为工具之意,谐音"糊涂",寓意追求"万事都作糊涂观,无所谓失,无所谓得& ...
- Java IO学习笔记八:Netty入门
作者:Grey 原文地址:Java IO学习笔记八:Netty入门 多路复用多线程方式还是有点麻烦,Netty帮我们做了封装,大大简化了编码的复杂度,接下来熟悉一下netty的基本使用. Netty+ ...
- 有模有样解决Flutter里Webview无法访问HTTP页面的问题
探索过程 Android9(好像是吧)开始谷歌就默认不让开发者访问不安全HTTP内容了,如果非要用HTTP,那必须在networkSecurityConfig里配置cleartextTrafficPe ...
- ubuntu开机卡在/dev/sda* clean
问题描述: ①Ubuntu通过再生龙从一台笔记本还原到另外一台笔记本(硬盘到硬盘),开机后卡在自检界面: ②备份前的笔记本为17年发布的笔记本,还原后的笔记本为2020款发布的笔记本 从网上搜了一大篇 ...
- leetcode动态规划题目总结
Hello everyone, I am a Chinese noob programmer. I have practiced questions on leetcode.com for 2 yea ...
- 乘风破浪,遇见华为鸿蒙智能终端系统(HarmonyOS 2),打造面向全场景的分布式操作系统
什么是鸿蒙智能终端系统(HarmonyOS 2) HarmonyOS 是新一代的智能终端操作系统,为不同设备的智能化.互联与协同提供了统一的语言.带来简洁,流畅,连续,安全可靠的全场景交互体验. ht ...
- 基于 Electron 实现 uTools 的超级面板
前言 为了进一步提高开发工作效率,最近我们基于 electron 开发了一款媲美 uTools 的开源工具箱 rubick.该工具箱不仅仅开源,最重要的是可以使用 uTools 生态内所有开源插件!这 ...