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爬虫之抓取糗事百科代码分享
Nov 06 Python
Python的Django框架使用入门指引
Apr 15 Python
Python中函数的参数传递与可变长参数介绍
Jun 30 Python
使用Python来开发Markdown脚本扩展的实例分享
Mar 04 Python
简单谈谈python的反射机制
Jun 28 Python
Pycharm学习教程(5) Python快捷键相关设置
May 03 Python
老生常谈python之鸭子类和多态
Jun 13 Python
使用python的pandas库读取csv文件保存至mysql数据库
Aug 20 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
Apr 15 Python
python求质数列表的例子
Nov 24 Python
python对Excel按条件进行内容补充(推荐)
Nov 24 Python
python统计字符的个数代码实例
Feb 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
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
2014/07/23 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
php倒计时出现-0情况的解决方法
2016/07/28 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
基于Jquery的开发个代阴影的对话框效果代码
2011/07/28 Javascript
jQuery 关于伪类选择符的使用说明
2013/04/24 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
node.js中module.exports与exports用法上的区别
2016/09/02 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
Vue组件中的data必须是一个function的原因浅析
2018/09/03 Javascript
解决vue keep-alive 数据更新的问题
2018/09/21 Javascript
JS删除数组指定值常用方法详解
2020/06/04 Javascript
[04:54]DOTA2-DPC中国联赛1月31日Recap集锦
2021/03/11 DOTA
详解Python的Django框架中的中间件
2015/07/24 Python
浅谈五大Python Web框架
2017/03/20 Python
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
Python简单实现两个任意字符串乘积的方法示例
2018/04/12 Python
详解Django中类视图使用装饰器的方式
2018/08/12 Python
python中PS 图像调整算法原理之亮度调整
2019/06/28 Python
Python高级property属性用法实例分析
2019/11/19 Python
如何基于python实现脚本加密
2019/12/28 Python
GANT英国官方网上商店:甘特衬衫
2018/02/06 全球购物
英国街头品牌:Bee Inspired Clothing
2018/02/12 全球购物
指针和引用有什么区别
2013/01/13 面试题
学生自我鉴定
2013/12/18 职场文书
银行介绍信范文
2014/01/10 职场文书
军训口号
2014/06/13 职场文书
运动会横幅标语
2014/06/17 职场文书
2014年施工员工作总结
2014/11/18 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
党员反四风学习心得体会
2016/01/22 职场文书
《乘法分配律》教学反思
2016/02/24 职场文书
js Proxy的原理详解
2021/05/25 Javascript
台积电称即便经济低迷也没有降价的计划
2022/04/21 数码科技
Python 避免字典和元组的多重嵌套问题
2022/07/15 Python