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 相关文章推荐
下载安装setuptool和pip linux安装pip    
Jan 24 Python
深入解析Python中的变量和赋值运算符
Oct 12 Python
在Django同1个页面中的多表单处理详解
Jan 25 Python
Python3之文件读写操作的实例讲解
Jan 23 Python
python随机数分布random测试
Aug 27 Python
python+opencv实现阈值分割
Dec 26 Python
Django框架模板用法入门教程
Nov 04 Python
Python高阶函数、常用内置函数用法实例分析
Dec 26 Python
python列表切片和嵌套列表取值操作详解
Feb 27 Python
Django实现将views.py中的数据传递到前端html页面,并展示
Mar 16 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
May 25 Python
通过代码实例了解Python sys模块
Sep 14 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
thinkphp实现图片上传功能
2016/01/13 PHP
如何让页面在打开时自动刷新一次让图片全部显示
2012/12/17 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
详谈JavaScript 匿名函数及闭包
2014/11/14 Javascript
javascript中的this详解
2014/12/08 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
2016/05/23 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
利用vscode编写vue的简单配置详解
2017/06/17 Javascript
canvas+gif.js打造自己的数字雨头像的示例代码
2017/10/26 Javascript
详解Vue组件实现tips的总结
2017/11/01 Javascript
修改npm全局安装模式的路径方法
2018/05/15 Javascript
微信小程序性能优化之checkSession的使用
2019/03/06 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
JavaScript实现栈结构Stack过程详解
2020/03/07 Javascript
vue项目配置使用flow类型检查的步骤
2020/03/18 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
2020/08/17 Javascript
Python获取Linux系统下的本机IP地址代码分享
2014/11/07 Python
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
python使用PyGame播放Midi和Mp3文件的方法
2015/04/24 Python
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
2016/12/10 Python
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
2020/04/03 Python
python 还原梯度下降算法实现一维线性回归
2020/10/22 Python
如何处理简单的PHP错误
2015/10/14 面试题
毕业生教师求职信
2013/10/20 职场文书
个性车贴标语
2014/06/24 职场文书
2014年“四风”问题个人整改措施
2014/09/17 职场文书
机器人瓦力观后感
2015/06/12 职场文书
学生会副主席竞选稿
2015/11/19 职场文书
电力企业职工培训心得体会
2016/01/11 职场文书
pytorch实现ResNet结构的实例代码
2021/05/17 Python
解决vue $http的get和post请求跨域问题
2021/06/07 Vue.js
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL