python3通过subprocess模块调用脚本并和脚本交互的操作

 更新时间:2020年12月05日 14:33:30   作者:齐梦星空  
这篇文章主要介绍了python3通过subprocess模块调用脚本并和脚本交互的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

因工作需要,需实现如题所示功能。查阅网上博客,资料,大多都是针对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多进程中,子进程中从键盘录入值,运行报错问题。

在python中,主进程允许从键盘录入值。而子进程是不允许的。

以上这篇python3通过subprocess模块调用脚本并和脚本交互的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Tornado Web服务器多进程启动的2个方法

    Tornado Web服务器多进程启动的2个方法

    这篇文章主要介绍了Tornado Web服务器多进程启动的2个方法,Tornado是一个用Ptyhon写的WEB服务器,需要的朋友可以参考下
    2014-08-08
  • Python数据分析之真实IP请求Pandas详解

    Python数据分析之真实IP请求Pandas详解

    这篇文章主要给大家介绍了Python数据分析之真实IP请求Pandas,文中通过示例嗲吗给大家介绍的很详细,相信对大家的学习或者理解具有一定的参考借鉴价值,有需要的朋友们可以参考借鉴,下面来一起学习学习吧。
    2016-11-11
  • python里使用正则表达式的组嵌套实例详解

    python里使用正则表达式的组嵌套实例详解

    这篇文章主要介绍了python里使用正则表达式的组嵌套实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • Python 微信爬虫完整实例【单线程与多线程】

    Python 微信爬虫完整实例【单线程与多线程】

    这篇文章主要介绍了Python 微信爬虫,结合完整实例形式分析了Python基于单线程与多线程模式爬取微信信息相关操作技巧,需要的朋友可以参考下
    2019-07-07
  • Tensorflow累加的实现案例

    Tensorflow累加的实现案例

    今天小编就为大家分享一篇Tensorflow累加的实现案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python sklearn数据预处理之正则化详解

    python sklearn数据预处理之正则化详解

    数据的预处理是数据分析,或者机器学习训练前的重要步骤,这篇文章主要为大家详细介绍了sklearn数据预处理中正则化的相关知识,需要的可以参考下
    2023-10-10
  • Python数据序列化之pickle模块

    Python数据序列化之pickle模块

    这篇文章主要介绍了Python数据序列化之pickle模块,pickle的本质是将Python数据还原为内存中的二进制数据,供用户转移、储存,更多详细内容,需要的小伙伴可以下面文章内容
    2022-03-03
  • 基于Python实现将列表数据生成折线图

    基于Python实现将列表数据生成折线图

    这篇文章主要介绍了如何利用Python中的pandas库和matplotlib库,实现将列表数据生成折线图,文中的示例代码简洁易懂,需要的可以参考一下
    2022-03-03
  • 关于tf.reverse_sequence()简述

    关于tf.reverse_sequence()简述

    今天小编就为大家分享一篇关于tf.reverse_sequence()简述,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python可视化之seborn图形外观设置

    Python可视化之seborn图形外观设置

    这篇文章主要介绍了Python可视化之seborn图形外观设置,本文介绍seaborn图形外观、图形缩放设置.具有一的的参考价值,需要的小伙伴可以参考一下
    2022-03-03

最新评论