Python子进程subpocess原理及用法解析
作者:陈严肃 发布时间:2021-10-11 19:18:27
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里面了
来源:https://www.cnblogs.com/chenyansu/p/10772085.html


猜你喜欢
- 路由通常HTTP URL的格式是这样的:http://host[:port][path]http表示协议。host表示主机。port为端口,
- python3.7 打包成exe程序环境:pycharm2018.1+win7+python3.7工具:pyinstaller1、安装pyi
- ORM模型介绍随着项目越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了:SQL语句重复利用率不高,越复杂的S
- 这篇文章主要介绍了Python hashlib模块加密过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 本文实例为大家分享了JavaScript实现网页计算器的具体代码,供大家参考,具体内容如下要求:在网页上实现简单的计算器功能和界面CSS样式
- 数据采集我们上一篇介绍了,如何采集王者最低战力,本文就来给大家介绍如何采集王者皮肤,买不起皮肤,当个桌面壁纸挺好的。下面,我和大家介绍如何获
- 如下所示:#! /usr/bin/env python# coding=utf-8#############################
- pygal.style的LightColorizedStyle参数 问题在《Python编程:从入门到实践》中的使用API的案例,
- 一开始的目的是学习十大挖掘算法(机器学习算法),并用编码实现一遍,但越往后学习,越往后实现编码,越发现自己的编码水平低下,学习能力低。这一个
- 实例如下所示:#########start 获取文件路径、文件名、后缀名############def jwkj_get_filePath_
- 前言写过的这些脚本有一个共性,都是和web相关的,总要用到获取链接的一些方法,累积不少爬虫抓站的经验,在此总结一下,那么以后做东西也就不用重
- 前言前面写过一篇用Python制作PPT的博客,感兴趣的可以参考用Python制作PPT这篇是关于用Python进行数据可视化的,准备作为一
- 一 .概述SQL Server 将某些系统事件和用户定义事件记录到 SQL Server 错误日志和 Microsoft Windows 应
- python的列表list可以用for循环进行遍历,实际开发中发现一个问题,就是遍历的时候删除会出错,例如l = [1,2,3,4]for
- 首先,FSO是FileSystemObject的简称。当然也就是我们的俗称FSO组件了,该组件可以用来处理驱动器、文件夹以及文件。它可以检测
- 前言面向对象编程对初学者来说不难理解但很难应用,虽然我们为大家总结过面向对象的三步走方法(定义类、创建对象、给对象发消息),但是说起来容易做
- 写程序必然需要版本控制,哪怕是个人项目也是必须的,VS2015开始默认提供了对Git的支持。考虑到现在Git很火,作为微软系的程序员也不得不
- MySQL如何查看元数据锁阻塞在哪里操作步骤:1、session 1 执行: start transaction;  
- 引言:刚学python好几天了,从java到python,基础学起来确实比较容易,语法掌握,基本概念上都比较容易入脑。唯一比较郁闷的是老想着
- 一、前言装饰器:本质就是函数,功能是为其他函数添加附加功能原则: 1、不修改被修饰函数的源代码