[terminal]關於進度條的學習

在PowerShell中隱藏光標html

在pip的源碼C:\Python36\Lib\site-packages\pip\utils\ui.py中發現了:python

 1 @contextlib.contextmanager
 2 def hidden_cursor(file):
 3     # The Windows terminal does not support the hide/show cursor ANSI codes,
 4     # even via colorama. So don't even try.
 5     if WINDOWS:
 6         yield
 7     # We don't want to clutter the output with control characters if we're
 8     # writing to a file, or if the user is running with --quiet.
 9     # See https://github.com/pypa/pip/issues/3418
10     elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO:
11         yield
12     else:
13         file.write(HIDE_CURSOR)
14         try:
15             yield
16         finally:
17             file.write(SHOW_CURSOR)

原本都打算放棄了, 次日在windows上PowerShell中一試竟然能夠git

具體HIDE_CURSOR的代碼在C:\Python36\Lib\site-packages\pip\_vendor\progress\helpers.py文件中github

1 HIDE_CURSOR = '\x1b[?25l'
2 SHOW_CURSOR = '\x1b[?25h'

跟進度條的鬥爭, 從sys.stdout.write()和sys.stdout.flush(), 到progressbar2, 再到tqdm, 再到以後由於tqdm在jupyter notebook中好看, 因而折騰anaconda, 最終試着研究tqdm源碼, 發現ascii參數, 再到研究pip源碼,着實學到很多, 不過像本少這種門外少年, 仍是須要時間慢慢來, 才能接受看源碼的設定. 苦笑...web

最後附上我的定製進度...稱不上條了....shell

 

 1 #!/usr/bin/env python3
 2 # -*- coding: UTF-8 -*-
 3 __author__ = "Sigai"
 4 
 5 # 9733, 9734
 6 from collections import deque
 7 import sys
 8 from time import sleep
 9 
10 d = deque([9733, 9734, 9733, 9734, 9733, 9734])
11 HIDE_CURSOR = '\x1b[?25l'
12 SHOW_CURSOR = '\x1b[?25h'
13 sys.stdout.write(HIDE_CURSOR)
14 while 1:
15     sys.stdout.write(f"\033[91m{''.join(chr(i) for i in d)}\033[0m")
16     sys.stdout.flush()
17     sys.stdout.write("\r")
18     sys.stdout.flush()
19     d.rotate(1)
20     sleep(.3)
21 sys.stdout.write(SHOW_CURSOR)

 

最新發現: https://my.oschina.net/jcseg/blog/178047windows

因而更改tqdm源碼 _tqdm.py  實現彩色進度條, 實現jupyter notebook中相似的進度條咯~~ide

1             # format bar depending on availability of unicode/ascii chars
2             if ascii:
3                 bar_length, frac_bar_length = divmod(
4                     int(frac * N_BARS * 10), 10)
5 
6                 bar = '\033[42m \033[0m' * bar_length
7                 frac_bar = chr(48 + frac_bar_length) if frac_bar_length \
8                     else ' '

更改源碼中第416行的'#' 爲上面第6行的仿真終端代碼函數

願望達成~~~學習

想去github提交下, 不過我是win10系統, cmd, powershell都有效果, 沒試過別的平臺

仍是之後更厲害再去貢獻吧...

2017.11.06 更新----------------------------------

早上看流暢的python中提到python環境變量PYTHONIOENCODING的設置, 心想會不會能夠簡單實現, 但是windows設置了環境變量並無用, 但是tqdm能夠輸出正確的終端控制字符.

這就讓我抓狂了, 因此反正無聊, 繼續翻tqdm源碼, 實驗過程當中發現 執行一次tqdm的進度條以後, cmd和powershell就能夠正確輸出終端控制字符了, WTF, tqdm確定幹了什麼!!!

因此看trang, 發現是tqdm的shotcut而已, 只能從頭看_tqdm部分了, 最後發現它import了colorama模塊並且還執行了init的函數, 這TM確定有事兒啊!

就去這個模塊的PyPi看了一下, 果真init()以後就能夠執行終端控制了.....但是如今只能到這了 init裏面乾的事太多了, 看不懂.目前能夠簡單利用了

1 python -c "from colorama import init;init();print('\033[42m \033[0m')"

 

2017.12.14 更新---------------------------------

腳本運行完成, 發出蜂鳴提示功能

1 import winsound
2 winsound.Beep(2015, 3000)

 

美劇<黑客軍團>第一季第一集中破解心理醫生那段實際上是python腳本...一段打印顏色字符的代碼很不錯.

 1 class bcolors:
 2     HEADER = '\033[95m'
 3     OKBLUE = '\033[94m'
 4     OKGREEN = '\033[92m'
 5     WARNING = '\033[93m'
 6     FAIL = '\033[91m'
 7     ENDC = '\033[0m'
 8     BOLD = '\033[1m'
 9     UNDERLINE = '\033[4m'
10  
11 prompt = bcolors.OKBLUE + 'root@elliot:' + bcolors.ENDC + ' '
12 
13 print(prompt + 'ping (222.12.154.102)')

學習一下 https://ideone.com/R8VuQp

 發現控制終端輸出顏色已經有固定模式了

class INFO:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    ARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'

    def __init__(self):
        self.SUCCESS = self.OKGREEN + self.BOLD + 'Found SUCCESS!' + self.ENDC
        self.FAILED = self.FAIL + self.BOLD + 'Found FAILED!' + self.ENDC

http://www.freebuf.com/articles/web/127888.html

 python的colorama可實現跨平臺

相關文章
相關標籤/搜索