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批量修改文件后缀示例代码分享
Dec 24 Python
python简单操作excle的方法
Sep 12 Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 Python
使用Filter过滤python中的日志输出的实现方法
Jul 17 Python
wxpython+pymysql实现用户登陆功能
Nov 19 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
Dec 13 Python
Python中pyecharts安装及安装失败的解决方法
Feb 18 Python
python通过文本在一个图中画多条线的实例
Feb 21 Python
详解anaconda离线安装pytorchGPU版
Sep 08 Python
pycharm远程连接服务器并配置python interpreter的方法
Dec 23 Python
Python进阶学习之带你探寻Python类的鼻祖-元类
May 08 Python
如何利用python实现Simhash算法
Jun 28 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
晶体管来复再生式二管收音机
2021/03/02 无线电
锁定年轻人的双倍活力 星巴克推出星倍醇即饮浓咖啡
2021/03/03 咖啡文化
PHP 中dirname(_file_)讲解
2007/03/18 PHP
php中通过curl smtp发送邮件
2012/06/05 PHP
php中的Base62类(适用于数值转字符串)
2013/08/12 PHP
php如何获取文件的扩展名
2015/10/28 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
2017/07/13 PHP
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
2015/09/14 Javascript
Node.js巧妙实现Web应用代码热更新
2015/10/22 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
相册展示PhotoSwipe.js插件实现
2016/08/25 Javascript
JavaScript实现一个简易的计算器实例代码
2018/05/10 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
小程序封装wx.request请求并创建接口管理文件的实现
2019/04/29 Javascript
JavaScript中的连续赋值问题实例分析
2019/07/12 Javascript
[02:03]《现实生活中的DOTA2》—林书豪&DOTA2职业选手出演短片
2015/08/18 DOTA
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
讲解Python中的标识运算符
2015/05/14 Python
Python中的迭代器与生成器高级用法解析
2016/06/28 Python
python脚本替换指定行实现步骤
2017/07/11 Python
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
django框架实现一次性上传多个文件功能示例【批量上传】
2019/06/19 Python
Python Sympy计算梯度、散度和旋度的实例
2019/12/06 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
Tensorflow实现多GPU并行方式
2020/02/03 Python
如何利用python生成MD5并去重
2020/12/07 Python
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
澳大利亚儿童和婴儿产品在线商店:Lime Tree Kids
2017/10/05 全球购物
新东网科技Java笔试题
2012/07/13 面试题
远程网络教育毕业生自我鉴定
2014/04/14 职场文书
暑假学习心得体会
2014/09/02 职场文书
学习十八大的感悟
2015/08/11 职场文书
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL