Python子进程subpocess原理及用法解析


Posted in Python onJuly 16, 2020

python的子进程嘛,就是利用python打开一个子进程(当然像是一句废话),但是可能和我们理解的不太一样。

一:如何理解?

我们可能的理解:多开一个进程运行某个python函数(如果只想实现这个功能,请使用multiprocessing包)

正确的理解:python通过shell/cmd 打开一个新的程序进程,而不限于python函数,比如我们可以开一个“ls”指令的进程列出当前文件夹下的文件,这个“ls”指令明显是一个shell通用函数,而不是python

函数:

# 打开子进程运行“ls”。输出当前文件夹下文件<br data-filtered="filtered">import subprocess
p = subprocess.run(["ls"])

二. 如何使用?

当我们想单纯地利用subprocess打开一个进程运行python函数的时候,我们甚至要迂回地去做:

比方说这样:

(1)新建一个需要运行的函数脚本 test_print.py

import sys
def print_it(a, b , c):
  print(a)
  print(b)
  print(c)
if __name__ == "__main__":
  print_it(sys.argv[1], sys.argv[2], sys.argv[3])

(2)再建一个脚本,通过传递参数的方式运行 test_print.py

import subprocess


p = subprocess.run(["python", "test_print.py", "a1", "b2", "c3"])
pp = subprocess.run(["python", "test_print.py", "d4", "e5", "f6"])

(3) 输出结果:

a1

b2

c3

d4

e5

f6

三:一些简单用法

1. 比方说重定向输出:

(1)依旧是新建一个需要运行的函数脚本 test_print.py

import sys
def print_it(a, b , c):
  print(a)
  print(b)
  print(c)
if __name__ == "__main__":
  print_it(sys.argv[1], sys.argv[2], sys.argv[3])

(2)再建一个脚本,通过传递参数的方式运行 test_print.py

import subprocess

p = subprocess.Popen(["python", "test_print.py", "a1", "b2", "c3"], stdout=subprocess.PIPE, shell=True) #shell=True 为必须,否则stdout无法读出
pp = subprocess.Popen(["python", "test_print.py", "d4", "e5", "f6"], stdout=subprocess.PIPE, shell=True) 

print(p.stdout.read()) 
print(pp.stdout.read())

然而此时,输出的结果是二进制文件

b'a1\r\nb2\r\nc3\r\n'
b'd4\r\ne5\r\nf6\r\n'

我们需要对此进行处理(当然你不处理也可以,就是看着别扭)

import subprocess
p = subprocess.Popen(["python", "test_print.py", "a1", "b2", "c3"], stdout=subprocess.PIPE, shell=True) #shell=True 为必须,否则stdout无法读出
pp = subprocess.Popen(["python", "test_print.py", "d4", "e5", "f6"], stdout=subprocess.PIPE, shell=True) 
# 用str转化一下就好。
print(str(p.stdout.read(), encoding = "utf8"))
print(str(pp.stdout.read(), encoding = "utf8"))

(3)定向到外部文件

import subprocess
# 注意,此步骤为必须
f_handler=open('out.log', 'w')
p = subprocess.run(["python", "test_print.py", "a1", "b2", "c3"], stdout=f_handler)
pp = subprocess.run(["python", "test_print.py", "d4", "e5", "f6"], stdout=f_handler)# 一个错误用法
p_error = subprocess.run(["python", "test_print.py", "d4", "e5", "f6"], stdout='out.log') # 这样是不行的

我们会发现,屏幕上什么都不会显示,输出结果已经导入到out.log里面了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Tornado服务器中绑定域名、虚拟主机的方法
Aug 22 Python
Python+matplotlib绘制不同大小和颜色散点图实例
Jan 19 Python
Python PyQt4实现QQ抽屉效果
Apr 20 Python
centos6.8安装python3.7无法import _ssl的解决方法
Sep 17 Python
Python给图像添加噪声具体操作
Mar 03 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
Mar 11 Python
基于python实现蓝牙通信代码实例
Nov 19 Python
tensorflow pb to tflite 精度下降详解
May 25 Python
基于python代码批量处理图片resize
Jun 04 Python
pyecharts在数据可视化中的应用详解
Jun 08 Python
python跨文件使用全局变量的实现
Nov 17 Python
Python采集股票数据并制作可视化柱状图
Apr 04 Python
python redis存入字典序列化存储教程
Jul 16 #Python
Python是怎样处理json模块的
Jul 16 #Python
Python2手动安装更新pip过程实例解析
Jul 16 #Python
解决redis与Python交互取出来的是bytes类型的问题
Jul 16 #Python
Python 使用 PyQt5 开发的关机小工具分享
Jul 16 #Python
Python csv文件记录流程代码解析
Jul 16 #Python
Python 抓取数据存储到Redis中的操作
Jul 16 #Python
You might like
隐藏你的.php文件的实现方法
2007/03/19 PHP
php中jpgraph类库的使用介绍
2013/08/08 PHP
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
jquery插件validate验证的小例子
2013/05/08 Javascript
JS实现点击下载的小例子
2013/07/10 Javascript
nodejs开发环境配置与使用
2014/11/17 NodeJs
jquery实现的美女拼图游戏实例
2015/05/04 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
2016/04/14 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
JavaScript事件用法浅析
2016/10/31 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
JS中的BOM应用
2018/02/02 Javascript
WebSocket的通信过程与实现方法详解
2018/04/29 Javascript
echarts统计x轴区间的数值实例代码详解
2019/07/07 Javascript
解决echarts数据二次渲染不成功的问题
2020/07/20 Javascript
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
详解Python3.6安装psutil模块和功能简介
2018/05/30 Python
python统计字母、空格、数字等字符个数的实例
2018/06/29 Python
使用Python实现企业微信的自动打卡功能
2019/04/30 Python
python 定时器每天就执行一次的实现代码
2019/08/14 Python
基于torch.where和布尔索引的速度比较
2020/01/02 Python
pytorch自定义二值化网络层方式
2020/01/07 Python
python上selenium的弹框操作实现
2020/07/13 Python
通过实例简单了解python yield使用方法
2020/08/06 Python
拿来就用!Python批量合并PDF的示例代码
2020/08/10 Python
聊聊python中的异常嵌套
2020/09/01 Python
python 动态渲染 mysql 配置文件的示例
2020/11/20 Python
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
幼儿园端午节活动方案
2014/08/25 职场文书
2014年教师教学工作总结
2014/11/08 职场文书
关于职业道德的心得体会
2016/01/18 职场文书
一封真诚的自荐信帮你赢得机会
2019/05/07 职场文书