t.pyに次のコードがあります:-
import time
for i in range(1,100):
print(f"{i}% \r",end='')
time.sleep(0.05)
このように1行で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.org/3.8/library/subprocess.html#frequently-used-arguments):
「エンコーディングまたはエラーが指定されている場合、またはテキスト(universal_newlinesとも呼ばれます)がtrueの場合、ファイルオブジェクト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")
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加