怎么在python3中利用subprocess模块实现脚本交互
创始人
2024-11-21 13:22:12
0次

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中,主进程允许从键盘录入值。而子进程是不允许的。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...