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搭建APNS苹果推送通知推送服务的相关模块使用指南
Jun 02 Python
python+pillow绘制矩阵盖尔圆简单实例
Jan 16 Python
python中abs&amp;map&amp;reduce简介
Feb 20 Python
Python实现k-means算法
Feb 23 Python
python 文件查找及内容匹配方法
Oct 25 Python
django框架防止XSS注入的方法分析
Jun 21 Python
python读文件的步骤
Oct 08 Python
Python中six模块基础用法
Dec 08 Python
Python爬虫之Selenium下拉框处理的实现
Dec 04 Python
pycharm + django跨域无提示的解决方法
Dec 06 Python
如何用Python编写一个电子考勤系统
Feb 08 Python
python基础之类属性和实例属性
Oct 24 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延迟静态绑定实例分析
2015/02/08 PHP
Javascript 面向对象编程(coolshell)
2012/03/18 Javascript
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
在javascript中执行任意html代码的方法示例解读
2013/12/25 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
通过node-mysql搭建Windows+Node.js+MySQL环境的教程
2016/03/01 Javascript
javascript 广告移动特效的实现代码
2016/06/25 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
2017/01/09 Javascript
canvas实现十二星座星空图
2017/02/14 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
2017/07/04 Javascript
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
微信小程序实现同一页面取值的方法分析
2019/04/30 Javascript
node使用request请求的方法
2019/12/20 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
js实现简单的随机点名器
2020/09/17 Javascript
js删除对象中的某一个字段的方法实现
2021/01/11 Javascript
python获取豆瓣电影简介代码分享
2014/01/16 Python
用Python编写脚本使IE实现代理上网的教程
2015/04/23 Python
python主线程捕获子线程的方法
2018/06/17 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
2018/07/10 Python
Python通过队列来实现进程间通信的示例
2020/10/14 Python
pycharm 实现调试窗口恢复
2021/02/05 Python
移动端Web页面的CSS3 flex布局快速上手指南
2016/05/31 HTML / CSS
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
利用HTML5的新特点实现图片文件异步上传
2014/05/29 HTML / CSS
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
伦敦最受欢迎的蛋糕店:Konditor & Cook
2019/11/01 全球购物
人事主管岗位职责
2014/01/30 职场文书
文明餐桌行动实施方案
2014/02/19 职场文书
劳动工资科岗位职责范本
2014/03/02 职场文书
请假条怎么写
2014/04/10 职场文书
学雷锋活动倡议书
2014/08/30 职场文书
2014年领导班子工作总结
2014/12/11 职场文书