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 相关文章推荐
在Python的Bottle框架中使用微信API的示例
Apr 23 Python
python实现统计代码行数的方法
May 22 Python
Python中逗号的三种作用实例分析
Jun 08 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
Jun 09 Python
Python AES加密实例解析
Jan 18 Python
Python实现随机生成手机号及正则验证手机号的方法
Apr 25 Python
深入了解python中元类的相关知识
Aug 29 Python
Python 识别12306图片验证码物品的实现示例
Jan 20 Python
python tkinter之顶层菜单、弹出菜单实例
Mar 04 Python
python 使用多线程创建一个Buffer缓存器的实现思路
Jul 02 Python
Numpy实现卷积神经网络(CNN)的示例
Oct 09 Python
python编程实现清理微信重复缓存文件
Nov 01 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 file_get_contents 函数超时的几种解决方法
2009/07/30 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
2014/07/08 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
PHP常用设计模式之委托设计模式
2016/02/13 PHP
javaScript - 如何引入js代码
2021/03/09 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
JavaScript编写推箱子游戏
2015/07/07 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
Bootstrap基本组件学习笔记之面板(14)
2016/12/08 Javascript
微信小程序 九宫格实例代码
2017/01/21 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
2017/03/29 Javascript
详解webpack进阶之loader篇
2017/08/23 Javascript
React从react-router路由上做登陆验证控制的方法
2018/05/10 Javascript
浅谈Webpack下多环境配置的思路
2018/06/27 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
vue自定义指令实现仅支持输入数字和浮点型的示例
2019/10/30 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python爬虫教程之爬取百度贴吧并下载的示例
2014/03/07 Python
使用django-suit为django 1.7 admin后台添加模板
2014/11/18 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
python支持多线程的爬虫实例
2019/12/21 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
Python 可视化神器Plotly详解
2020/12/26 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
2021/02/06 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
团队拓展活动方案
2014/08/28 职场文书
户籍证明书标准模板
2014/09/10 职场文书
营销与策划实训报告
2014/11/05 职场文书
2014年乡镇卫生院工作总结
2014/11/24 职场文书
专业技术职务聘任证明
2015/03/02 职场文书
2019年世界儿童日宣传标语
2019/11/22 职场文书
Python实现批量自动整理文件
2022/03/16 Python