<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://liumaoli.me/feed.xml" rel="self" type="application/atom+xml" /><link href="https://liumaoli.me/" rel="alternate" type="text/html" /><updated>2026-05-16T04:08:23-07:00</updated><id>https://liumaoli.me/feed.xml</id><title type="html">Maoli Liu</title><subtitle>personal webpage</subtitle><author><name>Maoli Liu</name><email>mlliu@cse.cuhk.edu.hk</email></author><entry><title type="html">Multi-threading and Multi-processing Progress Visualization with Python’s `rich` Library</title><link href="https://liumaoli.me/notes/notes-about-rich/" rel="alternate" type="text/html" title="Multi-threading and Multi-processing Progress Visualization with Python’s `rich` Library" /><published>2024-01-27T00:00:00-08:00</published><updated>2024-01-27T00:00:00-08:00</updated><id>https://liumaoli.me/notes/note-1</id><content type="html" xml:base="https://liumaoli.me/notes/notes-about-rich/"><![CDATA[<p>The Python package <a href="https://github.com/Textualize/rich"><code class="language-plaintext highlighter-rouge">rich</code></a> is for rich text and beautiful formatting in the terminal.</p>

<p>Here are some notes about how to use <code class="language-plaintext highlighter-rouge">rich</code> for visualizing the progress of long-running tasks, printing rich text… and some tips for displaying progress bars in multi-threading and multi-processing scenarios.<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup></p>

<h2 id="visualizing-the-progress-of-long-running-tasks">Visualizing the Progress of Long-running Tasks</h2>

<p>When running long tasks in Python, it’s helpful to have a visual progress indicator. <code class="language-plaintext highlighter-rouge">rich</code> provides several methods to achieve this.</p>

<h3 id="using-track">Using <code class="language-plaintext highlighter-rouge">track</code></h3>

<p>For <code class="language-plaintext highlighter-rouge">for</code> loops with a known number of iterations, <code class="language-plaintext highlighter-rouge">track</code> is a useful method.</p>

<ul>
  <li>
    <p>Example</p>

    <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">rich.progress</span> <span class="kn">import</span> <span class="n">track</span>
<span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">sleep</span>
<span class="k">for</span> <span class="n">step</span> <span class="ow">in</span> <span class="n">track</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">),</span> <span class="n">description</span><span class="o">=</span><span class="s">"[green]Processing..."</span><span class="p">):</span>
    <span class="k">print</span><span class="p">(</span><span class="n">step</span><span class="p">)</span>
    <span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</code></pre></div>    </div>

    <p>There will be a progress bar with a green “Processing…” message, increasing by 10% every 1 second.</p>
  </li>
</ul>

<h3 id="using-status">Using <code class="language-plaintext highlighter-rouge">status</code></h3>

<p>The <code class="language-plaintext highlighter-rouge">status</code> method can be used to indicate ongoing tasks when the exact progress percentage is not crucial or known, displaying a spinner with a temporary status message.</p>

<ul>
  <li>
    <p>Example</p>

    <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">sleep</span>
<span class="kn">from</span> <span class="nn">rich.console</span> <span class="kn">import</span> <span class="n">Console</span>
<span class="n">console</span> <span class="o">=</span> <span class="n">Console</span><span class="p">()</span>
<span class="n">tasks</span> <span class="o">=</span> <span class="p">[</span><span class="sa">f</span><span class="s">"task </span><span class="si">{</span><span class="n">n</span><span class="si">}</span><span class="s">"</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">11</span><span class="p">)]</span>
<span class="k">with</span> <span class="n">console</span><span class="p">.</span><span class="n">status</span><span class="p">(</span><span class="s">"[bold green]Working on tasks..."</span><span class="p">)</span> <span class="k">as</span> <span class="n">status</span><span class="p">:</span>
  <span class="k">while</span> <span class="n">tasks</span><span class="p">:</span>
      <span class="n">task</span> <span class="o">=</span> <span class="n">tasks</span><span class="p">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
      <span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
      <span class="n">console</span><span class="p">.</span><span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s">"</span><span class="si">{</span><span class="n">task</span><span class="si">}</span><span class="s"> complete"</span><span class="p">)</span>
</code></pre></div>    </div>

    <p>There will be a spinner with the message “Working on tasks…” and logs each completed task.</p>
  </li>
  <li>
    <p>Some arguments:</p>
    <ul>
      <li><code class="language-plaintext highlighter-rouge">status</code>: specifying the message to be displayed.</li>
      <li><code class="language-plaintext highlighter-rouge">spinner</code>: specifying the spinner to be used.
        <ul>
          <li>common spinners: <code class="language-plaintext highlighter-rouge">dots</code>, <code class="language-plaintext highlighter-rouge">star</code>, <code class="language-plaintext highlighter-rouge">growHorizontal</code>, <code class="language-plaintext highlighter-rouge">bouncingBar</code>, <code class="language-plaintext highlighter-rouge">bouncingBall</code>, …</li>
          <li>use <code class="language-plaintext highlighter-rouge">python -m rich.spinner</code> to check all spinners.</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h3 id="using-progress">Using <code class="language-plaintext highlighter-rouge">Progress</code></h3>

<p>The <code class="language-plaintext highlighter-rouge">Progress</code> class provides a more customizable way and can be used for more complex scenarios.</p>

<p>For example, when there are multiple tasks to be monitored, we can use <code class="language-plaintext highlighter-rouge">Progress</code> to display multiple progress bars simultaneously.</p>

<ul>
  <li>
    <p>Example</p>

    <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">time</span>
<span class="kn">from</span> <span class="nn">concurrent.futures</span> <span class="kn">import</span> <span class="n">ThreadPoolExecutor</span>

<span class="kn">from</span> <span class="nn">rich</span> <span class="kn">import</span> <span class="k">print</span>
<span class="kn">from</span> <span class="nn">rich.progress</span> <span class="kn">import</span> <span class="n">Progress</span>

<span class="n">progress</span> <span class="o">=</span> <span class="n">Progress</span><span class="p">()</span>

<span class="k">def</span> <span class="nf">working</span><span class="p">(</span><span class="n">worker</span><span class="p">,</span> <span class="n">amount</span><span class="p">,</span> <span class="n">efficiency</span><span class="p">):</span>
    <span class="n">progress</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">worker</span><span class="p">,</span> <span class="n">total</span><span class="o">=</span><span class="n">amount</span><span class="p">)</span>
    <span class="n">progress</span><span class="p">.</span><span class="n">start_task</span><span class="p">(</span><span class="n">worker</span><span class="p">)</span>
    <span class="k">while</span> <span class="ow">not</span> <span class="n">progress</span><span class="p">.</span><span class="n">finished</span><span class="p">:</span>
        <span class="n">progress</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">worker</span><span class="p">,</span> <span class="n">advance</span><span class="o">=</span><span class="n">efficiency</span><span class="p">)</span>
        <span class="n">time</span><span class="p">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
    <span class="n">task_load</span> <span class="o">=</span> <span class="p">{</span><span class="s">"maoli"</span><span class="p">:</span> <span class="mi">100</span><span class="p">,</span> <span class="s">"zhuohua"</span><span class="p">:</span> <span class="mi">80</span><span class="p">}</span>
    <span class="n">efficiency</span> <span class="o">=</span> <span class="p">{</span><span class="s">"maoli"</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s">"zhuohua"</span><span class="p">:</span> <span class="mi">1</span><span class="p">}</span>
    <span class="k">with</span> <span class="n">progress</span><span class="p">:</span>
        <span class="n">maoli</span> <span class="o">=</span> <span class="n">progress</span><span class="p">.</span><span class="n">add_task</span><span class="p">(</span><span class="s">"[cyan]Maoli's working..."</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
        <span class="n">zhuohua</span> <span class="o">=</span> <span class="n">progress</span><span class="p">.</span><span class="n">add_task</span><span class="p">(</span><span class="s">"[magenta]Zhuohua's working..."</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
        <span class="k">with</span> <span class="n">ThreadPoolExecutor</span><span class="p">()</span> <span class="k">as</span> <span class="n">pool</span><span class="p">:</span>
            <span class="n">pool</span><span class="p">.</span><span class="n">submit</span><span class="p">(</span><span class="n">working</span><span class="p">,</span> <span class="n">maoli</span><span class="p">,</span> <span class="n">task_load</span><span class="p">[</span><span class="s">"maoli"</span><span class="p">],</span> <span class="n">efficiency</span><span class="p">[</span><span class="s">"maoli"</span><span class="p">])</span>
            <span class="n">pool</span><span class="p">.</span><span class="n">submit</span><span class="p">(</span><span class="n">working</span><span class="p">,</span> <span class="n">zhuohua</span><span class="p">,</span> <span class="n">task_load</span><span class="p">[</span><span class="s">"zhuohua"</span><span class="p">],</span> <span class="n">efficiency</span><span class="p">[</span><span class="s">"zhuohua"</span><span class="p">])</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"[green]Tasks complete!"</span><span class="p">)</span>
</code></pre></div>    </div>

    <p>Maoli and Zhuohua are working. :tired_face:</p>
  </li>
</ul>

<h4 id="handling-multi-threading-and-multi-processing-scenarios">Handling Multi-threading and Multi-processing Scenarios</h4>

<ul>
  <li>When there are multiple threads in a single process (e.g., <code class="language-plaintext highlighter-rouge">ThreadPoolExecutor</code>, <code class="language-plaintext highlighter-rouge">multiprocessing.pool.ThreadPool</code>), the progress bars will be updated correctly.</li>
  <li>However, in scenarios involving multiple processes (e.g., <code class="language-plaintext highlighter-rouge">multiprocessing.Pool</code>), <code class="language-plaintext highlighter-rouge">Progress</code> may not work as expected since the progress bars are designed to be updated in the same process. Comnumication between processes is required if we want to use <code class="language-plaintext highlighter-rouge">Progress</code> in this scenario.</li>
  <li>
    <p>A toy example: using <code class="language-plaintext highlighter-rouge">multiprocessing.Pipe</code> to communicate between processes.</p>

    <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">time</span>
<span class="kn">from</span> <span class="nn">multiprocessing</span> <span class="kn">import</span> <span class="n">Pipe</span><span class="p">,</span> <span class="n">Pool</span>

<span class="kn">from</span> <span class="nn">rich</span> <span class="kn">import</span> <span class="k">print</span>
<span class="kn">from</span> <span class="nn">rich.live</span> <span class="kn">import</span> <span class="n">Live</span>
<span class="kn">from</span> <span class="nn">rich.progress</span> <span class="kn">import</span> <span class="n">Progress</span>


<span class="k">def</span> <span class="nf">working</span><span class="p">(</span><span class="n">worker</span><span class="p">,</span> <span class="n">total_amount</span><span class="p">,</span> <span class="n">efficiency</span><span class="p">,</span> <span class="n">pipe</span><span class="p">):</span>
    <span class="n">completed_amount</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="k">while</span> <span class="n">completed_amount</span> <span class="o">&lt;</span> <span class="n">total_amount</span><span class="p">:</span>
        <span class="n">amount</span> <span class="o">=</span> <span class="n">efficiency</span>
        <span class="n">completed_amount</span> <span class="o">+=</span> <span class="n">amount</span>
        <span class="n">completed_amount</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">completed_amount</span><span class="p">,</span> <span class="n">total_amount</span><span class="p">)</span>
        <span class="n">time</span><span class="p">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.5</span><span class="p">)</span>
        <span class="n">pipe</span><span class="p">.</span><span class="n">send</span><span class="p">((</span><span class="n">worker</span><span class="p">,</span> <span class="n">completed_amount</span><span class="p">))</span>
    <span class="n">pipe</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
    <span class="k">return</span> <span class="sa">f</span><span class="s">"[bold red]</span><span class="si">{</span><span class="n">worker</span><span class="si">}</span><span class="s"> completed!"</span>


<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
    <span class="n">task_amount</span> <span class="o">=</span> <span class="p">{</span><span class="s">"maoli"</span><span class="p">:</span> <span class="mi">20</span><span class="p">,</span> <span class="s">"zhuohua"</span><span class="p">:</span> <span class="mi">20</span><span class="p">}</span>
    <span class="n">efficiency</span> <span class="o">=</span> <span class="p">{</span><span class="s">"maoli"</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s">"zhuohua"</span><span class="p">:</span> <span class="mi">1</span><span class="p">}</span>
    <span class="n">maoli_conn</span><span class="p">,</span> <span class="n">maoli_child_conn</span> <span class="o">=</span> <span class="n">Pipe</span><span class="p">()</span>
    <span class="n">zhuohua_conn</span><span class="p">,</span> <span class="n">zhuohua_child_conn</span> <span class="o">=</span> <span class="n">Pipe</span><span class="p">()</span>
    <span class="n">progress</span> <span class="o">=</span> <span class="n">Progress</span><span class="p">()</span>
    <span class="k">with</span> <span class="n">progress</span><span class="p">:</span>
        <span class="n">main_progress</span> <span class="o">=</span> <span class="n">progress</span><span class="p">.</span><span class="n">add_task</span><span class="p">(</span><span class="s">"[green]Main progress..."</span><span class="p">,</span> <span class="n">total</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
        <span class="n">maoli</span> <span class="o">=</span> <span class="n">progress</span><span class="p">.</span><span class="n">add_task</span><span class="p">(</span><span class="s">"[cyan]Maoli's Working..."</span><span class="p">,</span> <span class="n">total</span><span class="o">=</span><span class="n">task_amount</span><span class="p">[</span><span class="s">"maoli"</span><span class="p">])</span>
        <span class="n">zhuohua</span> <span class="o">=</span> <span class="n">progress</span><span class="p">.</span><span class="n">add_task</span><span class="p">(</span><span class="s">"[magenta]Zhuohua's Working..."</span><span class="p">,</span> <span class="n">total</span><span class="o">=</span><span class="n">task_amount</span><span class="p">[</span><span class="s">"zhuohua"</span><span class="p">])</span>
        <span class="n">pool</span> <span class="o">=</span> <span class="n">Pool</span><span class="p">(</span><span class="n">processes</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
        <span class="n">maoli_process</span> <span class="o">=</span> <span class="n">pool</span><span class="p">.</span><span class="n">apply_async</span><span class="p">(</span><span class="n">working</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="s">"maoli"</span><span class="p">,</span> <span class="n">task_amount</span><span class="p">[</span><span class="s">"maoli"</span><span class="p">],</span> <span class="n">efficiency</span><span class="p">[</span><span class="s">"maoli"</span><span class="p">],</span> <span class="n">maoli_child_conn</span><span class="p">))</span>
        <span class="n">zhuohua_process</span> <span class="o">=</span> <span class="n">pool</span><span class="p">.</span><span class="n">apply_async</span><span class="p">(</span><span class="n">working</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="s">"zhuohua"</span><span class="p">,</span> <span class="n">task_amount</span><span class="p">[</span><span class="s">"zhuohua"</span><span class="p">],</span> <span class="n">efficiency</span><span class="p">[</span><span class="s">"zhuohua"</span><span class="p">],</span> <span class="n">zhuohua_child_conn</span><span class="p">))</span>
        <span class="n">pool</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
        <span class="n">completed_workers</span> <span class="o">=</span> <span class="p">{</span><span class="s">'maoli'</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="s">'zhuohua'</span><span class="p">:</span> <span class="mi">0</span><span class="p">}</span>
        <span class="k">while</span> <span class="nb">sum</span><span class="p">(</span><span class="n">completed_workers</span><span class="p">.</span><span class="n">values</span><span class="p">())</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span>
            <span class="c1">#check maoli
</span>            <span class="k">if</span> <span class="ow">not</span> <span class="n">maoli_conn</span><span class="p">.</span><span class="n">closed</span> <span class="ow">and</span> <span class="n">maoli_conn</span><span class="p">.</span><span class="n">poll</span><span class="p">():</span>
                <span class="n">task_id</span><span class="p">,</span> <span class="n">completed</span> <span class="o">=</span> <span class="n">maoli_conn</span><span class="p">.</span><span class="n">recv</span><span class="p">()</span>
                <span class="n">progress</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">maoli</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="sa">f</span><span class="s">"[cyan]Maoli completed: </span><span class="si">{</span><span class="mi">100</span><span class="o">*</span><span class="n">completed</span><span class="o">/</span><span class="n">task_amount</span><span class="p">[</span><span class="s">'maoli'</span><span class="p">]</span><span class="si">:</span><span class="p">.</span><span class="mi">2</span><span class="n">f</span><span class="si">}</span><span class="s">%"</span><span class="p">,</span> <span class="n">completed</span><span class="o">=</span><span class="n">completed</span><span class="p">)</span>
                <span class="k">if</span> <span class="n">completed</span> <span class="o">&gt;=</span> <span class="n">task_amount</span><span class="p">[</span><span class="s">"maoli"</span><span class="p">]:</span>
                    <span class="n">maoli_conn</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
                    <span class="n">completed_workers</span><span class="p">[</span><span class="s">"maoli"</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
                    <span class="k">print</span><span class="p">(</span><span class="n">maoli_process</span><span class="p">.</span><span class="n">get</span><span class="p">())</span>
                    <span class="n">progress</span><span class="p">.</span><span class="n">advance</span><span class="p">(</span><span class="n">main_progress</span><span class="p">)</span>
            <span class="c1">#check zhuohua
</span>            <span class="k">if</span> <span class="ow">not</span> <span class="n">zhuohua_conn</span><span class="p">.</span><span class="n">closed</span> <span class="ow">and</span> <span class="n">zhuohua_conn</span><span class="p">.</span><span class="n">poll</span><span class="p">():</span>
                <span class="n">task_id</span><span class="p">,</span> <span class="n">completed</span> <span class="o">=</span> <span class="n">zhuohua_conn</span><span class="p">.</span><span class="n">recv</span><span class="p">()</span>
                <span class="n">progress</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">zhuohua</span><span class="p">,</span>
                                <span class="n">description</span><span class="o">=</span><span class="sa">f</span><span class="s">"[magenta]Zhuohua completed: </span><span class="si">{</span><span class="mi">100</span><span class="o">*</span><span class="n">completed</span><span class="o">/</span><span class="n">task_amount</span><span class="p">[</span><span class="s">'zhuohua'</span><span class="p">]</span><span class="si">:</span><span class="p">.</span><span class="mi">2</span><span class="n">f</span><span class="si">}</span><span class="s">%"</span><span class="p">,</span>
                                <span class="n">completed</span><span class="o">=</span><span class="n">completed</span><span class="p">)</span>
                <span class="k">if</span> <span class="n">completed</span> <span class="o">&gt;=</span> <span class="n">task_amount</span><span class="p">[</span><span class="s">"zhuohua"</span><span class="p">]:</span>
                    <span class="n">completed_workers</span><span class="p">[</span><span class="s">"zhuohua"</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
                    <span class="n">zhuohua_conn</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
                    <span class="k">print</span><span class="p">(</span><span class="n">zhuohua_process</span><span class="p">.</span><span class="n">get</span><span class="p">())</span>
                    <span class="n">progress</span><span class="p">.</span><span class="n">advance</span><span class="p">(</span><span class="n">main_progress</span><span class="p">)</span>
        <span class="c1"># for res in results:
</span>        <span class="c1">#     print(res.get())
</span>        <span class="n">pool</span><span class="p">.</span><span class="n">join</span><span class="p">()</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"[bold yellow]Tasks completed, exiting..."</span><span class="p">)</span>
</code></pre></div>    </div>
  </li>
</ul>

<h2 id="printing-rich-text-in-python">Printing Rich Text in Python</h2>

<p>We can import the <code class="language-plaintext highlighter-rouge">print</code> function from <code class="language-plaintext highlighter-rouge">rich</code> to replace the built-in <code class="language-plaintext highlighter-rouge">print</code> function.</p>

<ul>
  <li>Example
    <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">rich</span> <span class="kn">import</span> <span class="k">print</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Hello, [bold magenta]World[/bold magenta]!"</span><span class="p">)</span>
</code></pre></div>    </div>
  </li>
</ul>

<h2 id="working-with-the-console">Working with the <code class="language-plaintext highlighter-rouge">Console</code></h2>

<h3 id="basic-printing">Basic Printing</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">rich.console</span> <span class="kn">import</span> <span class="n">Console</span>

<span class="n">console</span> <span class="o">=</span> <span class="n">Console</span><span class="p">()</span>
<span class="n">console</span><span class="p">.</span><span class="k">print</span><span class="p">(</span><span class="s">"Hello, Maoli!"</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="styling-text">Styling Text</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">console</span><span class="p">.</span><span class="k">print</span><span class="p">(</span><span class="s">"Hello"</span><span class="p">,</span> <span class="n">style</span><span class="o">=</span><span class="s">"bold red"</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="logging-with-timestamps-and-file-information">Logging with Timestamps and File Information</h3>

<ul>
  <li><code class="language-plaintext highlighter-rouge">Console.log()</code></li>
</ul>

<h2 id="creating-tables-with-table">Creating Tables with <code class="language-plaintext highlighter-rouge">Table</code></h2>

<ul>
  <li>
    <p>Example</p>

    <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">rich.table</span> <span class="kn">import</span> <span class="n">Table</span>
<span class="kn">from</span> <span class="nn">rich.console</span> <span class="kn">import</span> <span class="n">Console</span>

<span class="n">table</span> <span class="o">=</span> <span class="n">Table</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">"A Table"</span><span class="p">)</span>
<span class="n">table</span><span class="p">.</span><span class="n">add_column</span><span class="p">(</span><span class="s">"Column 1"</span><span class="p">)</span>
<span class="n">table</span><span class="p">.</span><span class="n">add_row</span><span class="p">(</span><span class="s">"Row 1"</span><span class="p">)</span>
<span class="n">console</span> <span class="o">=</span> <span class="n">Console</span><span class="p">()</span>
<span class="n">console</span><span class="p">.</span><span class="k">print</span><span class="p">(</span><span class="n">table</span><span class="p">)</span>
</code></pre></div>    </div>
  </li>
</ul>
<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>This note is with the help of GitHub Copilot. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Maoli Liu</name><email>mlliu@cse.cuhk.edu.hk</email></author><category term="Python" /><category term="rich" /><category term="multi-threading" /><category term="multi-processing" /><category term="visualization" /><category term="progress bars" /><summary type="html"><![CDATA[The Python package rich is for rich text and beautiful formatting in the terminal.]]></summary></entry></feed>