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 文件与目录操作
Dec 24 Python
python中split方法用法分析
Apr 17 Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
Jun 03 Python
Python 含参构造函数实例详解
May 25 Python
python使用fork实现守护进程的方法
Nov 16 Python
小白如何入门Python? 制作一个网站为例
Mar 06 Python
TensorFlow深度学习之卷积神经网络CNN
Mar 09 Python
Python依赖包整体迁移方法详解
Aug 15 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
Jan 25 Python
Python3打包exe代码2种方法实例解析
Feb 17 Python
如何通过python检查文件是否被占用
Dec 18 Python
你喜欢篮球吗?Python实现篮球游戏
Jun 11 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
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
php面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
CI框架支持$_GET的两种实现方法
2016/05/18 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
PHP常用算法和数据结构示例(必看篇)
2017/03/15 PHP
一个多次搜索+多次传值的解决方案
2007/01/20 Javascript
JavaScript版DateAdd和DateDiff函数代码
2012/03/01 Javascript
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
JS针对Array的各种操作汇总
2016/11/29 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
parabola.js抛物线与加入购物车效果的示例代码
2017/10/25 Javascript
详解如何在angular2中获取节点
2017/11/23 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
js 闭包深入理解与实例分析
2020/03/19 Javascript
vuex 多模块时 模块内部的mutation和action的调用方式
2020/07/24 Javascript
python批量提取word内信息
2015/08/09 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
pytorch 调整某一维度数据顺序的方法
2018/12/08 Python
python绘制直方图和密度图的实例
2019/07/08 Python
pytorch 修改预训练model实例
2020/01/18 Python
Python自动重新加载模块详解(autoreload module)
2020/04/01 Python
学习python需要有编程基础吗
2020/06/02 Python
美国波西米亚风格服装品牌:Show Me Your Mumu
2018/01/05 全球购物
英国Flybe航空官网:欧洲最大的独立支线廉价航空公司
2019/07/15 全球购物
个人生活学习自我评价范文
2013/11/26 职场文书
《北京的春节》教学反思
2014/04/07 职场文书
演讲稿的格式及范文
2014/08/22 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
2015年汽车销售工作总结
2015/04/07 职场文书
学校百日安全活动总结
2015/05/07 职场文书
给朋友的赠语
2015/06/23 职场文书
2015新员工工作总结范文
2015/10/15 职场文书
情况说明书格式及范文
2019/06/24 职场文书