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程序员面试题 你必须提前准备!
Jan 16 Python
详解Django-auth-ldap 配置方法
Dec 10 Python
python3爬虫怎样构建请求header
Dec 23 Python
六行python代码的爱心曲线详解
May 17 Python
pandas基于时间序列的固定时间间隔求均值的方法
Jul 04 Python
python判断自身是否正在运行的方法
Aug 08 Python
python实现批量修改服务器密码的方法
Aug 13 Python
python常用数据重复项处理方法
Nov 22 Python
python实现差分隐私Laplace机制详解
Nov 25 Python
python 实现多维数组(array)排序
Feb 28 Python
Jupyter加载文件的实现方法
Apr 14 Python
Python sorted对list和dict排序
Jun 09 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
19个超实用的PHP代码片段
2014/03/14 PHP
js prototype 格式化数字 By shawl.qiu
2007/04/02 Javascript
一些javascript一些题目的解析
2010/12/25 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
2013/07/17 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
2014/10/16 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
2016/01/21 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
2016/03/10 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
Web前端开发之水印、图片验证码
2016/11/27 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
Google 爬虫如何抓取 JavaScript 的内容
2017/04/07 Javascript
JavaScript模块模式实例详解
2017/10/25 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
vue实现文件上传读取及下载功能
2020/11/17 Javascript
layer.open 获取不到表单信息的解决方法
2019/09/26 Javascript
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
Python常用小技巧总结
2015/06/01 Python
关于python的list相关知识(推荐)
2017/08/30 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
Python对称的二叉树多种思路实现方法
2020/02/28 Python
瑞典手机壳品牌:Richmond & Finch
2018/04/28 全球购物
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
介绍一下内联、左联、右联
2013/12/31 面试题
餐饮部总监岗位职责范文
2014/02/13 职场文书
生产部厂长助理职位说明书
2014/03/03 职场文书
公益广告标语
2014/06/19 职场文书
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
大学生暑期社会实践证明范本
2014/10/24 职场文书
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python
MySQL高级进阶sql语句总结大全
2022/03/16 MySQL
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle