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实现协同过滤的教程
Apr 08 Python
开源Web应用框架Django图文教程
Mar 09 Python
python2 与python3的print区别小结
Jan 16 Python
解决Python requests库编码 socks5代理的问题
May 07 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
Python实现读取机器硬件信息的方法示例
Jun 09 Python
Python wxpython模块响应鼠标拖动事件操作示例
Aug 23 Python
python使用 __init__初始化操作简单示例
Sep 26 Python
python 实现检验33品种数据是否是正态分布
Dec 09 Python
python 实现线程之间的通信示例
Feb 14 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
Jun 24 Python
PyCharm 2020.2 安装详细教程
Sep 25 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
php数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
PHP中串行化用法示例
2016/11/16 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
PHP简单实现二维数组的矩阵转置操作示例
2017/11/24 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
laravel框架关于搜索功能的实现
2018/03/15 PHP
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
jQuery点击弹出下拉菜单的小例子
2013/08/01 Javascript
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
2013/12/14 Javascript
Javascript小技巧之生成html元素
2014/05/15 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
laypage分页控件使用实例详解
2016/05/19 Javascript
jQuery获取同级元素的简单代码
2016/07/09 Javascript
JavaScript获取当前时间向前推三个月的方法示例
2017/02/04 Javascript
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
微信小程序实现图片懒加载的示例代码
2017/12/13 Javascript
微信小程序实现导航栏选项卡效果
2020/06/19 Javascript
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
在vue项目中优雅的使用SVG的方法实例详解
2018/12/03 Javascript
深入理解 ES6中的 Reflect用法
2020/07/18 Javascript
JavaScript/TypeScript 实现并发请求控制的示例代码
2021/01/18 Javascript
Python的__builtin__模块中的一些要点知识
2015/05/02 Python
Python功能键的读取方法
2015/05/28 Python
Python工程师面试题 与Python基础语法相关
2016/01/14 Python
浅谈Python 多进程默认不能共享全局变量的问题
2019/01/11 Python
Python的形参和实参使用方式
2019/12/24 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
美术教学感言
2014/02/22 职场文书
扬尘污染防治方案
2014/06/15 职场文书
英文产品推荐信
2015/03/27 职场文书
新学期开学标语2015
2015/07/16 职场文书
会议主持词通用版
2019/04/02 职场文书