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同时向控制台和文件输出日志logging的方法
May 26 Python
python rsa 加密解密
Mar 20 Python
使用paramiko远程执行命令、下发文件的实例
Oct 01 Python
python之matplotlib学习绘制动态更新图实例代码
Jan 23 Python
Python爬虫的两套解析方法和四种爬虫实现过程
Jul 20 Python
python实现将多个文件分配到多个文件夹的方法
Jan 07 Python
python实现字符串完美拆分split()的方法
Jul 16 Python
Django框架HttpResponse对象用法实例分析
Nov 01 Python
python3 实现口罩抽签的功能
Mar 11 Python
Python实现EM算法实例代码
Oct 04 Python
linux系统下pip升级报错的解决方法
Jan 31 Python
pytest实现多进程与多线程运行超好用的插件
Jul 15 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中使用mktime获取时间戳的一个黑色幽默分析
2012/05/31 PHP
PHP反向代理类代码
2014/08/15 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
2016/11/23 PHP
PHP读取word文档的方法分析【基于COM组件】
2017/08/01 PHP
阻止子元素继承父元素事件具体思路及实现
2013/05/02 Javascript
对于this和$(this)的个人理解
2013/09/08 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
three.js实现炫酷的全景3D重力感应
2018/12/30 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
2020/11/11 Javascript
微信小程序实现登录注册功能
2020/12/29 Javascript
Python修改Excel数据的实例代码
2013/11/01 Python
Python利用pandas计算多个CSV文件数据值的实例
2018/04/19 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
2018/11/16 Python
ML神器:sklearn的快速使用及入门
2019/07/11 Python
使用Python将字符串转换为格式化的日期时间字符串
2019/09/01 Python
python打印直角三角形与等腰三角形实例代码
2019/10/20 Python
wxpython绘制圆角窗体
2019/11/18 Python
Python装饰器原理与基本用法分析
2020/01/07 Python
在python中利用dict转json按输入顺序输出内容方式
2020/02/27 Python
CSS3截取字符串实例代码【推荐】
2018/06/07 HTML / CSS
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
巴西男士个人护理产品商店:SHOP4MEN
2017/08/07 全球购物
Eclipse面试题
2014/03/22 面试题
让世界充满爱演讲稿
2014/05/24 职场文书
文员转正自我鉴定怎么写
2014/09/29 职场文书
单位介绍信格式
2015/01/31 职场文书
结婚保证书(卖身契)
2015/02/26 职场文书
迎国庆主题班会
2015/08/17 职场文书
求职信如何撰写?
2019/05/22 职场文书