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 相关文章推荐
jupyter安装小结
Mar 13 Python
Python实现在线音乐播放器
Mar 03 Python
Python计算两个日期相差天数的方法示例
May 23 Python
python中os和sys模块的区别与常用方法总结
Nov 14 Python
使用pandas read_table读取csv文件的方法
Jul 04 Python
PyCharm配置mongo插件的方法
Nov 30 Python
python数据处理 根据颜色对图片进行分类的方法
Dec 08 Python
Python中IP地址处理IPy模块的方法
Aug 16 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
Jul 31 Python
使用python实现微信小程序自动签到功能
Apr 27 Python
python基础之停用词过滤详解
Apr 21 Python
python实现简单的聊天小程序
Jul 07 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
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
实例详解PHP中html word 互转的方法
2016/01/28 PHP
PHP中Cookie的使用详解(简单易懂)
2017/04/28 PHP
学习ExtJS table布局
2009/10/08 Javascript
jquery ready函数、css函数及text()使用示例
2013/09/27 Javascript
jquery给图片添加鼠标经过时的边框效果
2013/11/12 Javascript
利用JS进行图片的切换即特效展示图片
2013/12/03 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
探究Vue.js 2.0新增的虚拟DOM
2016/10/20 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
Angular4 Select选择改变事件的方法
2018/10/09 Javascript
微信小程序从注册账号到上架(图文详解)
2019/07/17 Javascript
vue中 this.$set的用法详解
2019/09/06 Javascript
vue实现element表格里表头信息提示功能(推荐)
2019/11/20 Javascript
python&MongoDB爬取图书馆借阅记录
2016/02/05 Python
python实现手机通讯录搜索功能
2018/02/22 Python
PyQt5实现简易计算器
2020/05/30 Python
python实现猜拳游戏
2020/03/04 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
python获取系统内存占用信息的实例方法
2020/07/17 Python
Python爬取微信小程序Charles实现过程图解
2020/09/29 Python
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
台湾森森购物网:U-mall
2017/10/16 全球购物
一份Java笔试题
2012/02/21 面试题
成功的餐厅经营创业计划书
2014/01/15 职场文书
中学生励志演讲稿
2014/04/26 职场文书
五好文明家庭事迹材料
2014/12/20 职场文书
辞职书格式样本
2015/02/26 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书
雄兵连:第三季先行图公开,天使恶魔联合,银河之力的新力量
2021/06/11 国漫
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis
JavaScript中的LHS和RHS分析详情
2022/04/06 Javascript
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js
分享很少见很有用的SQL功能CORRESPONDING
2022/08/05 MySQL