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中的数据存储到系统本地的简单方法
Apr 11 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
Jul 09 Python
Python使用gRPC传输协议教程
Oct 16 Python
Python中logging实例讲解
Jan 17 Python
python调用c++传递数组的实例
Feb 13 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
Jun 21 Python
pycharm修改文件的默认打开方式的步骤
Jul 29 Python
浅谈Django2.0 加xadmin踩的坑
Nov 15 Python
Python利用Scrapy框架爬取豆瓣电影示例
Jan 17 Python
python 函数中的参数类型
Feb 11 Python
matlab灰度图像调整及imadjust函数的用法详解
Feb 27 Python
使用Keras加载含有自定义层或函数的模型操作
Jun 10 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关于IE下的iframe跨域导致session丢失问题解决方法
2013/10/10 PHP
php mysql操作mysql_connect连接数据库实例详解
2016/12/26 PHP
Javascript 获取LI里的内容
2008/12/17 Javascript
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
2013/01/24 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
js hover 定时器(实例代码)
2013/11/12 Javascript
Eclipse配置Javascript开发环境图文教程
2015/01/29 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
2015/03/23 Javascript
在JavaScript中操作时间之getUTCDate()方法的使用
2015/06/10 Javascript
javascript基础知识
2016/06/07 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
jQuery日期范围选择器附源码下载
2017/05/23 jQuery
Angularjs实现上传图片预览功能
2017/09/01 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
基于vue-cli 打包时抽离项目相关配置文件详解
2018/03/07 Javascript
webpack打包js的方法
2018/03/12 Javascript
[43:51]2014 DOTA2国际邀请赛中国区预选赛 Dream Times VS TongFu
2014/05/22 DOTA
通过C++学习Python
2015/01/20 Python
Python中使用PIPE操作Linux管道
2015/02/04 Python
python简单线程和协程学习心得(分享)
2017/06/14 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
2018/04/19 Python
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
利用python-docx模块写批量生日邀请函
2019/08/26 Python
Python异常继承关系和自定义异常实现代码实例
2020/02/20 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
大学生的创业计划书就该这么写
2014/01/30 职场文书
超市重阳节活动方案
2014/02/10 职场文书
经典的毕业生自荐信范文
2014/04/14 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
文员试用期转正自我鉴定
2014/09/14 职场文书
建党伟业观后感
2015/06/01 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js