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 相关文章推荐
pandas数值计算与排序方法
Apr 12 Python
python利用smtplib实现QQ邮箱发送邮件
May 20 Python
Python实现数据结构线性链表(单链表)算法示例
May 04 Python
python opencv 图像拼接的实现方法
Jun 27 Python
python实现共轭梯度法
Jul 03 Python
使用Filter过滤python中的日志输出的实现方法
Jul 17 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
Aug 06 Python
numpy.ndarray 实现对特定行或列取值
Dec 05 Python
keras模型保存为tensorflow的二进制模型方式
May 25 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
Jun 05 Python
Django admin组件的使用
Oct 24 Python
scrapy实践之翻页爬取的实现
Jan 05 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
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
PHP函数import_request_variables()用法分析
2016/04/02 PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
2016/10/08 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
2017/02/15 PHP
PHP中的浅复制与深复制的实例详解
2017/10/26 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
PHP常用函数之格式化时间操作示例
2019/10/21 PHP
JavaScript Cookie显示用户上次访问的时间和次数
2009/12/08 Javascript
Lazy Load 延迟加载图片的jQuery插件中文使用文档
2012/10/18 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
indexOf 和 lastIndexOf 使用示例介绍
2014/09/02 Javascript
jQuery实现的Tab滑动选项卡及图片切换(多种效果)小结
2015/09/14 Javascript
jQuery移动web开发中的页面初始化与加载事件
2015/12/03 Javascript
javascript中加var和不加var的区别 你真的懂吗
2016/01/06 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
实例讲解JavaScript中的this指向错误解决方法
2016/06/13 Javascript
Js 获取当前函数参数对象的实现代码
2016/06/20 Javascript
浅析BootStrap Treeview的简单使用
2016/10/12 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
2017/03/09 Javascript
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
JS实现数组删除指定元素功能示例
2019/06/05 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
Python 列表list使用介绍
2014/11/30 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
2015/04/17 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
python 多进程共享全局变量之Manager()详解
2019/08/15 Python
创新型城市实施方案
2014/03/06 职场文书
单位绩效考核方案
2014/05/11 职场文书
2016年会开场白台词
2015/06/01 职场文书
中学团支部工作总结
2015/08/13 职场文书
opencv 分类白天与夜景视频的方法
2021/06/05 Python
Python开发五子棋小游戏
2022/05/02 Python
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL