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用ConfigObj读写配置文件的实现代码
Mar 04 Python
深入浅出分析Python装饰器用法
Jul 28 Python
Python找出最小的K个数实例代码
Jan 04 Python
python 集合 并集、交集 Series list set 转换的实例
May 29 Python
Python实现读写INI配置文件的方法示例
Jun 09 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
Oct 11 Python
Python爬虫:将headers请求头字符串转为字典的方法
Aug 21 Python
Django自带日志 settings.py文件配置方法
Aug 30 Python
使用Python操作ArangoDB的方法步骤
Feb 02 Python
pycharm设置python文件模板信息过程图解
Mar 10 Python
python 链接sqlserver 写接口实例
Mar 11 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
Jul 03 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
实现分十页分向前十页向后十页的处理
2006/10/09 PHP
PHP编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
推荐一些非常不错的javascript学习资源站点
2007/08/29 Javascript
Javascript基础教程之switch语句
2015/01/18 Javascript
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
分享一个精简的vue.js 图片lazyload插件实例
2017/03/13 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
js模块加载方式浅析
2017/08/12 Javascript
vue.js的computed,filter,get,set的用法及区别详解
2018/03/08 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
浅谈Vue.js之初始化el以及数据的绑定说明
2019/11/14 Javascript
js实现简单的随机点名器
2020/09/17 Javascript
Python写的服务监控程序实例
2015/01/31 Python
Django框架下在视图中使用模版的方法
2015/07/16 Python
python list元素为tuple时的排序方法
2018/04/18 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
Python第三方库h5py_读取mat文件并显示值的方法
2019/02/08 Python
python字符串判断密码强弱
2020/03/18 Python
关于python 跨域处理方式详解
2020/03/28 Python
Python根据字符串调用函数过程解析
2020/11/05 Python
Python 列表反转显示的四种方法
2020/11/16 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
使用HTML5 IndexDB存储图像和文件的示例
2018/11/05 HTML / CSS
《雷雨》教学反思
2014/02/20 职场文书
挂职学习心得体会
2014/09/09 职场文书
2015商场元旦促销活动策划方案
2014/12/09 职场文书
毕业生班级鉴定评语
2015/01/04 职场文书
公路施工安全责任书
2015/05/08 职场文书
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL