我在t.py里有以下代码:-。
import time
for i in range(1,100):
print(f"{i}% \r",end='')
time.sleep(0.05)
它的单行数是1到99,就像这样:-。
所以当我执行下面的代码时,我希望得到同样的结果。
import subprocess as sb
import sys
lol = sb.Popen('python t.py',stdout=sb.PIPE,shell=True,text=True)
while True:
l = lol.stdout.read(1)
if not l and lol.poll() is not None:
break
if(l == '\n'): # for checking
print(" it should've been \\r") # this should not happen
sys.stdout.write(l)
sys.stdout.flush()
print("done")
但这段代码在所有单独的行中打印出1%到99%的数据。
1% it should've been \r
2% it should've been \r
3% it should've been \r
4% it should've been \r
..... i have skipped this part .....
99% it should've been \r
done
所以我加了一个小if语句
if(l == '\n'):
print(" it should've been \\r")
上面的if语句显示'\r'可能会被转换为'\n',这是我不希望看到的。
好吧,它在文档中是这样写的:(https:/docs.python.org3.8librarysubprocess.html#frequently-used-arguments):
"如果指定了编码或错误,或者text(也称为universal_newlines)为真,文件对象stdin,stdout和stderr将以文本模式打开,使用调用中指定的编码和错误,或者使用io.TextIOWrapper的默认值。"
"对于stdout和stderr,输出中的所有行尾都将被转换为'\n'。当其构造函数的换行参数为None时,更多信息请参见io.TextIOWrapper类的文档。"
删除text=True标志以避免这种行为。当你这样做的时候,请注意,你从stdout读取的东西现在是字节数组而不是字符串,你必须对它们进行相应的处理。
下面的 t.py 和主脚本的实现可以达到你想要的目的。
t.py.主脚本
import time
import sys
for i in range(1,100):
print(f'{i} \r', end='')
sys.stdout.flush()
time.sleep(0.2)
主脚本。
import subprocess as sb
import sys
lol = sb.Popen('python3 t.py',stdout=sb.PIPE,shell=True)
while True:
l = lol.stdout.read(1)
if not l and lol.poll() is not None:
break
print(l.decode("utf-8"), end="")
print("done")