python3通过subprocess模块调用脚本并和脚本交互的操作


Posted in Python onDecember 05, 2020

因工作需要,需实现如题所示功能。查阅网上博客,资料,大多都是针对python2的,而且很多地方不明所以,所以自己整理了一下查阅的结果,重新写一篇博客。

预备知识

1、python3的默认字符串类型

Python 2.x 同时支持ASCII和 Unicode字符串,默认情况下是ASCII编码。而 Python 3中这种支持刚好调换:Unicode现在变成了默认类型,而 ASCII 字符串现在称为 bytes。 bytes 数据结构包含字节值,并且它

不应该再被视为一个字符串,因为它是一个包含数据的不可变字节数组

上面这句话出自《python核心编程》(第三版)。这造成了python2和python3的很大的不兼容性。就是很多方法在python2中可用,但是在python3中不可用。幸运的是python提供了解决这种问题的方法。

如果想把默认字符串转换成bytes类型,既把Unicode变成ASCII

# 方法一
bytes("str",encoding="utf8") # encoding="utf8"参数不可省略
egg:
 bytes("中国",encoding="gbk")
 b'\xd6\xd0\xb9\xfa'
 bytes("中国",encoding="utf-8")
 b'\xe4\xb8\xad\xe5\x9b\xbd'
#方法二
"str".encode(encoding="utf8") # encoding="utf8"可省略,因为已经是默认参数
egg:
 "中国".encode(encoding="gbk")
 b'\xd6\xd0\xb9\xfa'
 "中国".encode(encoding="utf8")
 b'\xe4\xb8\xad\xe5\x9b\xbd'
 
#上面两种方法的意思是一样的,就是按某种编码的方式,将Unicode转变成ASCII。其中utf8是Unicode码的一种存储类型或者实现类型(这个不是很清楚),常见的还有utf16等

如果想把bytes字符串转换成Unicode类型

bytes.decode( bytes码,encoding="编码方式" ) # bytes码的一般格式是 : b+字符串,如 b'abc'
egg:
 bytes.decode(b'\xe4\xb8\xad\xe5\x9b\xbd',encoding="utf-8")
 '中国'
 bytes.decode(b'\xd6\xd0\xb9\xfa',encoding="gbk")
 '中国'

2、sys模块的stdout,stdin,stderr*

sys.stdout.write(str) #将字符串str写入pipe,因为pipe的默认出口是终端,所以这句等价于 :print(str)
sys.stdin.readline() #从pipe读入一行数据,因为pipe的默认入口是终端,所以这里可以从终端输入数据

# 此外,需要注意的是这里的str使用unicode类型的字符串即可,不需要bytes类型的字符串

正式内容

建立文件src/main.py

import subprocess as sub
 import sys

 popen = sub.Popen("python ./test.py", stdin=sub.PIPE, stdout=sub.PIPE, stderr=sub.PIPE) #将输入,输出,错误都定向到新的pipe

 for line in sys.stdin: # 读取终端输入
  popen.stdin.write(line.encode(encoding="utf8")) # 写入pip,write的参数要是bytes类型
  popen.stdin.flush() #必须
  output = popen.stdout.readline() #从子进程读取数据,读到的结果是bytes类型
  sys.stdout.write(bytes.decode(output)) # sys模块stdout的参数要求是字符串,所以要解码,相当于print(out)

建立文件src/test.py,

import sys

while True:
 line = sys.stdin.readline() #读取父进程写入的内容
 sys.stdout.write(line) #将读到的内容返回给父进程,可哟用print代替
 # 注意:子进程的内容是无法打印的,其输出的任何信息都会发送给父进程,所以我们通过输出判断line变量是bytes类型还是unicode类型,但是根据上一个文件的sys.stdout.write(bytes.decode(output)语句可知应该是str类型。

补充知识:python中多进程子进程使用input()为什么运行会报EOFError

关于python3多进程中,子进程中从键盘录入值,运行报错问题。

python3通过subprocess模块调用脚本并和脚本交互的操作

在python中,主进程允许从键盘录入值。而子进程是不允许的。

以上这篇python3通过subprocess模块调用脚本并和脚本交互的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中使用序列的方法
Aug 03 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
Apr 02 Python
解决Matplotlib图表不能在Pycharm中显示的问题
May 24 Python
python实现机器学习之多元线性回归
Sep 06 Python
python numpy数组复制使用实例解析
Jan 10 Python
Python中join()函数多种操作代码实例
Jan 13 Python
django 利用Q对象与F对象进行查询的实现
May 15 Python
Python生成并下载文件后端代码实例
Aug 31 Python
Python __slots__的使用方法
Nov 15 Python
Python将list元素转存为CSV文件的实现
Nov 16 Python
python实现的web监控系统
Apr 27 Python
Python IO文件管理的具体使用
Mar 20 Python
python实现启动一个外部程序,并且不阻塞当前进程
Dec 05 #Python
python subprocess pipe 实时输出日志的操作
Dec 05 #Python
python 操作excel表格的方法
Dec 05 #Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 #Python
Python 利用flask搭建一个共享服务器的步骤
Dec 05 #Python
快速解决pymongo操作mongodb的时区问题
Dec 05 #Python
pymongo insert_many 批量插入的实例
Dec 05 #Python
You might like
改变Apache端口等配置修改方法
2008/06/05 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
2014/06/19 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
2014/07/28 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
VueJS组件之间通过props交互及验证的方式
2017/09/04 Javascript
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
react脚手架如何配置less和ant按需加载的方法步骤
2018/11/28 Javascript
js数据类型转换与流程控制操作实例分析
2019/12/18 Javascript
[03:26]《DAC最前线》之EG经理自述DOTA2经历
2015/02/02 DOTA
TensorFlow打印输出tensor的值
2020/04/19 Python
python 写一个文件分发小程序
2020/12/05 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
html5 canvas实现圆形时钟代码分享
2013/12/25 HTML / CSS
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
美国电视购物:QVC
2017/02/06 全球购物
运动会开幕式邀请函
2014/02/03 职场文书
最新结婚典礼主持词
2014/03/14 职场文书
《山谷中的谜底》教学反思
2014/04/26 职场文书
槐乡的孩子教学反思
2014/04/27 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
建筑节能汇报材料
2014/08/22 职场文书
干部个人对照检查材料
2014/08/25 职场文书
护士优质服务演讲稿
2014/08/26 职场文书
银行反洗钱宣传活动总结
2015/05/08 职场文书
php 原生分页
2021/04/01 PHP
Windows11里微软已经将驱动程序安装位置A盘删除
2021/11/21 数码科技
Golang Elasticsearches 批量修改查询及发送MQ
2022/04/19 Golang