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在Console下显示文本进度条的方法
Feb 14 Python
图文讲解选择排序算法的原理及在Python中的实现
May 04 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
Jun 03 Python
Python+PyQT5的子线程更新UI界面的实例
Jun 14 Python
基于python实现把json数据转换成Excel表格
May 07 Python
Python将字典转换为XML的方法
Aug 01 Python
Python使用xpath实现图片爬取
Sep 16 Python
Python中return函数返回值实例用法
Nov 19 Python
python动态规划算法实例详解
Nov 22 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
Feb 07 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 Python
Python WSGI 规范简介
Apr 11 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
比特率,大家看看这个就不用收音机音质去比MP3音质了
2021/03/01 无线电
PHP array_multisort()函数的使用札记
2011/07/03 PHP
域名和cookie问题(域名后缀)
2012/10/10 PHP
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
JS数组(Array)处理函数整理
2014/12/07 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
充分发挥Node.js程序性能的一些方法介绍
2015/06/23 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
js实现动态创建的元素绑定事件
2016/07/19 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
详解webpack多页面配置记录
2018/01/22 Javascript
微信小程序实现form表单本地储存数据
2019/06/27 Javascript
微信小程序保存图片到相册权限设置
2020/04/09 Javascript
[57:53]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#3OG VS VP
2016/03/03 DOTA
[01:19:46]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
2018/05/08 Python
linux下python使用sendmail发送邮件
2018/05/22 Python
六行python代码的爱心曲线详解
2019/05/17 Python
python 函数中的参数类型
2020/02/11 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
Python基于yield遍历多个可迭代对象
2020/03/12 Python
Django ModelForm操作及验证方式
2020/03/30 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
伦敦最受欢迎的蛋糕店:Konditor & Cook
2019/11/01 全球购物
美国沃尔玛网上超市:Walmart
2020/08/14 全球购物
广州品高软件.net笔面试题目
2012/04/18 面试题
银行实习的自我鉴定
2013/12/10 职场文书
自我评价范文
2013/12/22 职场文书
商场中秋节广播稿
2014/01/17 职场文书
光盘行动倡议书
2014/02/02 职场文书
4s店市场专员岗位职责
2014/04/09 职场文书
意向协议书
2015/01/27 职场文书
用JS实现飞机大战小游戏
2021/06/09 Javascript
SSM VUE Axios详解
2021/10/05 Vue.js