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小技巧之批量抓取美女图片
Jun 06 Python
Python for Informatics 第11章之正则表达式(二)
Apr 21 Python
python函数式编程学习之yield表达式形式详解
Mar 25 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
May 15 Python
Python操作MySQL数据库的方法
Jun 20 Python
python try except 捕获所有异常的实例
Oct 18 Python
Python操作SQLite数据库过程解析
Sep 02 Python
Python 面向对象之封装、继承、多态操作实例分析
Nov 21 Python
pytorch实现对输入超过三通道的数据进行训练
Jan 15 Python
Anaconda的安装与虚拟环境建立
Nov 18 Python
使用Python脚本对GiteePages进行一键部署的使用说明
May 27 Python
关于Python中进度条的六个实用技巧分享
Apr 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
ThinkPHP中I(),U(),$this->post()等函数用法
2014/11/22 PHP
php中session定期自动清理的方法
2015/11/12 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
javascript入门教程基础篇
2015/11/16 Javascript
js仿腾讯QQ的web登陆界面
2016/08/19 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
2016/08/23 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
2016/10/05 Javascript
基于bootstrap-datetimepicker.js不支持IE8的快速解决方法
2016/11/07 Javascript
关于iframe跨域POST提交的方法示例
2017/01/15 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
vue中的适配px2rem示例代码
2018/11/19 Javascript
Vue框架下引入ActiveX控件的问题解决
2019/03/25 Javascript
vue缓存的keepalive页面刷新数据的方法
2019/04/23 Javascript
el-select数据过多懒加载的解决(loadmore)
2019/05/29 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
element跨分页操作选择详解
2020/06/29 Javascript
微信小程序实现点击导航标签滚动定位到对应位置
2020/11/19 Javascript
[00:20]TI9不朽观赛名额抽取
2019/08/05 DOTA
Python安装第三方库的3种方法
2015/06/21 Python
简单谈谈Python中的几种常见的数据类型
2017/02/10 Python
Python处理Excel文件实例代码
2017/06/20 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
Python实现的三层BP神经网络算法示例
2018/02/07 Python
对numpy.append()里的axis的用法详解
2018/06/28 Python
将Pytorch模型从CPU转换成GPU的实现方法
2019/08/19 Python
Python创建临时文件和文件夹
2020/08/05 Python
Ann Taylor官方网站:美国最大的女性产品制造商之一
2016/09/14 全球购物
西雅图的买手店:Totokaelo
2019/10/19 全球购物
2014端午节活动策划方案
2014/01/27 职场文书
银行类自荐信
2014/02/04 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
挂牌仪式主持词
2014/03/20 职场文书
中班上学期幼儿评语
2014/04/30 职场文书
火箭队口号
2014/06/18 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
如何获取numpy array前N个最大值
2021/05/14 Python