防止将回车 "r "转换为 "n"

问题描述 投票:1回答:1

我在t.py里有以下代码:-。

import time

for i in range(1,100):
    print(f"{i}% \r",end='')
    time.sleep(0.05)

它的单行数是1到99,就像这样:-。

enter image description here

所以当我执行下面的代码时,我希望得到同样的结果。

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',这是我不希望看到的。

python subprocess carriage-return
1个回答
2
投票

好吧,它在文档中是这样写的:(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")
© www.soinside.com 2019 - 2024. All rights reserved.