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实现将pvr格式转换成pvr.ccz的方法
Apr 28 Python
Python3写入文件常用方法实例分析
May 22 Python
Python设计模式之抽象工厂模式
Aug 25 Python
python安装cx_Oracle模块常见问题与解决方法
Feb 21 Python
基于Django的python验证码(实例讲解)
Oct 23 Python
python计算两个矩形框重合百分比的实例
Nov 07 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
Nov 29 Python
python画图系列之个性化显示x轴区段文字的实例
Dec 13 Python
在Python 字典中一键对应多个值的实例
Feb 03 Python
Python中six模块基础用法
Dec 08 Python
Django数据库迁移常见使用方法
Nov 12 Python
python编程简单几行代码实现视频转换Gif示例
Oct 05 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&amp;&amp;mysql)二
2006/10/09 PHP
PHP中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
跟着JQuery API学Jquery 之三 筛选
2010/04/09 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
瀑布流布局并自动加载实现代码
2013/03/12 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
jquery获取复选框的值的简单实例
2016/05/26 Javascript
AngularJS 路由和模板实例及路由地址简化方法(必看)
2016/06/24 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
2016/11/04 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
2016/11/09 Javascript
Iscrool下拉刷新功能实现方法(推荐)
2017/06/26 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
ReactNative踩坑之配置调试端口的解决方法
2017/07/28 Javascript
Vue一个案例引发的递归组件的使用详解
2018/11/15 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
2018/12/30 Javascript
vue总线机制(bus)知识点详解
2020/05/10 Javascript
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
Python contextlib模块使用示例
2015/02/18 Python
python获取当前计算机cpu数量的方法
2015/04/18 Python
python实现批量修改文件名代码
2017/09/10 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
python binascii 进制转换实例
2019/06/12 Python
对python3.4 字符串转16进制的实例详解
2019/06/12 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
详解如何用canvas画一个微笑的表情
2019/03/14 HTML / CSS
关于webview适配H5上传照片或者视频文件的方法
2020/11/04 HTML / CSS
什么是事务?为什么需要事务?
2012/01/09 面试题
司法建议书范文
2014/05/13 职场文书
超越自我演讲稿
2014/05/21 职场文书
投标授权委托书范文
2014/08/02 职场文书
咖啡店创业计划书范文
2014/09/15 职场文书
2015年小学数学教师工作总结
2015/05/20 职场文书
会计入职心得体会
2016/01/22 职场文书
小学二年级语文教学反思
2016/03/03 职场文书
java objectUtils 使用可能会出现的问题
2022/02/28 Java/Android