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中常用操作字符串的函数与方法总结
Feb 04 Python
Python实现文件信息进行合并实例代码
Jan 17 Python
python针对不定分隔符切割提取字符串的方法
Oct 26 Python
Python多线程同步---文件读写控制方法
Feb 12 Python
Python 限制线程的最大数量的方法(Semaphore)
Feb 22 Python
python实现定时压缩指定文件夹发送邮件
Dec 22 Python
python基于SMTP协议发送邮件
May 31 Python
python中如何实现将数据分成训练集与测试集的方法
Sep 13 Python
opencv3/C++实现视频读取、视频写入
Dec 11 Python
Python爬虫小例子——爬取51job发布的工作职位
Jul 10 Python
Python中 range | np.arange | np.linspace三者的区别
Mar 22 Python
python对文档中元素删除,替换操作
Apr 02 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写的基于Memcache的Queue实现代码
2011/11/27 PHP
PHP关联数组的10个操作技巧
2013/01/21 PHP
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
Angularjs 创建可复用组件实例代码
2016/10/09 Javascript
JS实现Ajax的方法分析
2016/12/20 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
js实现双人五子棋小游戏
2020/05/28 Javascript
vue proxy 的优势与使用场景实现
2020/06/15 Javascript
vue实现井字棋游戏
2020/09/29 Javascript
[07:31]DOTA2卡尔工作室 英雄介绍主宰篇
2013/06/25 DOTA
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
python基础教程之Hello World!
2014/08/29 Python
Python在Console下显示文本进度条的方法
2016/02/14 Python
python基于phantomjs实现导入图片
2016/05/13 Python
Python入门学习指南分享
2018/04/11 Python
selenium+python设置爬虫代理IP的方法
2018/11/29 Python
Python使用crontab模块设置和清除定时任务操作详解
2019/04/09 Python
一篇文章了解Python中常见的序列化操作
2019/06/20 Python
python匿名函数的使用方法解析
2019/10/10 Python
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
澳大利亚领先的内衣店:Bendon Lingerie澳大利亚
2020/05/15 全球购物
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
俄罗斯第一家多品牌在线奢侈品精品店:Aizel.ru
2020/09/06 全球购物
extern在函数声明中是什么意思
2014/01/19 面试题
作为网站管理者应当如何防范XSS
2014/08/16 面试题
怎样有效的进行自我评价
2013/10/06 职场文书
程序员岗位职责
2013/11/11 职场文书
公司承诺书格式
2014/05/21 职场文书
食品安全承诺书
2014/05/22 职场文书
大学生创业计划书
2014/08/14 职场文书
文言文辞职信
2015/02/28 职场文书
告知书格式
2015/07/01 职场文书
python中pandas对多列进行分组统计的实现
2021/06/18 Python