<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Python Developer Tooling Handbook – Uv</title>
    <link>https://pydevtools.com/tags/uv/</link>
    <description>The Python Developer Tooling Handbook is a comprehensive guide to Python development tools including uv, ruff, pytest, mypy, ty, and more.</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Mon, 27 Apr 2026 09:00:00 -0400</lastBuildDate>
    
	  <atom:link href="https://pydevtools.com/tags/uv/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>What Reddit taught me about why people switch to uv</title>
      <link>https://pydevtools.com/blog/what-reddit-taught-me-about-why-people-switch-to-uv/</link>
      <pubDate>Mon, 27 Apr 2026 09:00:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/what-reddit-taught-me-about-why-people-switch-to-uv/</guid>
      <description>&lt;p&gt;A thread titled &lt;a href=&#34;https://www.reddit.com/r/Python/comments/1mfd3ww/but_really_why_use_uv/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&amp;ldquo;But really, why use uv?&amp;rdquo;&lt;/a&gt; landed on r/Python and pulled 476 upvotes. The original poster wasn&amp;rsquo;t antagonistic. They used Python casually, installed packages two or three times a month, and couldn&amp;rsquo;t see why &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; was worth adding to a setup that already worked.&lt;/p&gt;
&lt;p&gt;The comments convinced them. Reading through the top responses surfaces something the standard uv pitch misses: the compelling case for casual users is not the same as the compelling case for power users.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Did pip 26 close the gap with uv?</title>
      <link>https://pydevtools.com/blog/did-pip-26-close-the-gap-with-uv/</link>
      <pubDate>Fri, 24 Apr 2026 09:00:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/did-pip-26-close-the-gap-with-uv/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;pip&lt;/a&gt; 26.0 closed two of &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;&amp;rsquo;s clearest feature gaps in January: &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-pep-723/&#34;&gt;PEP 723&lt;/a&gt; script installs and a datetime-based package filter that mirrors uv&amp;rsquo;s &lt;code&gt;--exclude-newer&lt;/code&gt;. The &lt;a href=&#34;https://news.ycombinator.com/item?id=45751400&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;October 2025 Hacker News thread&lt;/a&gt; that kept circling back to &amp;ldquo;pip has quietly caught up&amp;rdquo; now reads less contrarian than it did at the time, and the &lt;a href=&#34;https://pydevtools.com/blog/openai-acquires-astral/&#34;&gt;OpenAI acquisition of Astral&lt;/a&gt; in March changes the &amp;ldquo;is this safe to depend on&amp;rdquo; calculus at the same time.&lt;/p&gt;
&lt;h2&gt;Review pip&amp;rsquo;s 2025 to 2026 releases&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;review-pips-2025-to-2026-releases&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#review-pips-2025-to-2026-releases&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Four pip releases have landed since April 2025, and the first three narrowed gaps uv was best known for:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How Astral Uses Its Own Tools</title>
      <link>https://pydevtools.com/blog/how-astral-uses-its-own-tools/</link>
      <pubDate>Thu, 23 Apr 2026 09:00:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/how-astral-uses-its-own-tools/</guid>
      <description>&lt;p&gt;Astral runs &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;ruff&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;, and &lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt; inside the repos that build them. Their &lt;code&gt;pyproject.toml&lt;/code&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-set-up-pre-commit-hooks-for-a-python-project/&#34;&gt;&lt;code&gt;.pre-commit-config.yaml&lt;/code&gt;&lt;/a&gt;, and CI files are public, and a walk through the three shows how the people making ruff, ty, and uv wire their own toolchain into the projects that produce it.&lt;/p&gt;
&lt;h2&gt;Build ty from source and type-check Python with it&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;build-ty-from-source-and-type-check-python-with-it&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#build-ty-from-source-and-type-check-python-with-it&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The ruff repository ships ty as part of its crate tree. Three CI steps build ty from source and run it against the repo&amp;rsquo;s own Python:&lt;/p&gt;</description>
    </item>
    <item>
      <title>uv won developer hearts. Now it has to win READMEs.</title>
      <link>https://pydevtools.com/blog/uv-admired-but-not-adopted/</link>
      <pubDate>Tue, 14 Apr 2026 09:00:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/uv-admired-but-not-adopted/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; ranked as the &lt;a href=&#34;https://survey.stackoverflow.co/2025/technology#admired-and-desired&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;most admired technology&lt;/a&gt; in Stack Overflow&amp;rsquo;s 2025 Developer Survey at 74%. A recent &lt;a href=&#34;https://aleyan.com/blog/2026-why-arent-we-uv-yet/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;analysis by Andrey Aleyan&lt;/a&gt; of the top 100,000 Python repositories on GitHub put uv adoption (measured by the presence of &lt;code&gt;uv.lock&lt;/code&gt;) at roughly 10%. The gap between &amp;ldquo;developers love this&amp;rdquo; and &amp;ldquo;developers ship this&amp;rdquo; is wider than any tooling story in recent memory.&lt;/p&gt;
&lt;p&gt;Aleyan&amp;rsquo;s diagnosis is that AI coding agents are the bottleneck: their training data is overwhelmingly &lt;code&gt;pip install -r requirements.txt&lt;/code&gt;, so they emit &lt;code&gt;pip install -r requirements.txt&lt;/code&gt;. That diagnosis is correct but incomplete. Adoption is bottlenecked by three reinforcing forces, and the AI-agent story is only one of them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How uv Solves Dependencies So Fast</title>
      <link>https://pydevtools.com/blog/how-uv-solves-dependencies-so-fast/</link>
      <pubDate>Thu, 09 Apr 2026 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/how-uv-solves-dependencies-so-fast/</guid>
      <description>&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-green-200 hx:bg-green-100 hx:text-green-900 hx:dark:border-green-200/30 hx:dark:bg-green-900/30 hx:dark:text-green-200&#34;&gt;
  &lt;p class=&#34;hx:flex hx:items-center hx:font-medium&#34;&gt;&lt;svg height=16px class=&#34;hx:inline-block hx:align-middle hx:mr-2&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z&#34;/&gt;&lt;/svg&gt;Tip&lt;/p&gt;

  &lt;div class=&#34;hx:w-full hx:min-w-0 hx:leading-7&#34;&gt;
    &lt;div class=&#34;hx:mt-6 hx:leading-7 hx:first:mt-0&#34;&gt;&lt;p&gt;Want more on uv? Browse every uv tutorial, how-to, reference, and explanation on the &lt;a href=&#34;https://pydevtools.com/handbook/topics/uv/&#34;&gt;uv topic page&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Python dependency resolution is NP-hard in the formal sense: it reduces to &lt;a href=&#34;https://en.wikipedia.org/wiki/Boolean_satisfiability_problem&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Boolean satisfiability&lt;/a&gt;. In a &lt;a href=&#34;https://www.janestreet.com/tech-talks/uv-an-extremely-fast-python-package-manager/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Jane Street tech talk&lt;/a&gt; (&lt;a href=&#34;https://youtu.be/gSKTfG1GXYQ&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;YouTube&lt;/a&gt;), Charlie Marsh walked through why &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;&amp;rsquo;s resolver has to solve this problem and the architectural decisions that let it do so 10-100x faster than &lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;pip&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenAI to Acquire Astral</title>
      <link>https://pydevtools.com/blog/openai-acquires-astral/</link>
      <pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/openai-acquires-astral/</guid>
      <description>&lt;p&gt;OpenAI &lt;a href=&#34;https://openai.com/index/openai-to-acquire-astral/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;announced today&lt;/a&gt; that it will acquire &lt;a href=&#34;https://astral.sh/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Astral&lt;/a&gt;, the company behind &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;Ruff&lt;/a&gt;, and &lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt;. The Astral team will join OpenAI&amp;rsquo;s Codex group after the deal closes, subject to regulatory approval.&lt;/p&gt;
&lt;h2&gt;What this means for Codex&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;what-this-means-for-codex&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#what-this-means-for-codex&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://openai.com/index/codex/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Codex&lt;/a&gt;, OpenAI&amp;rsquo;s coding agent, has grown to over 2 million weekly active users, with 3x user growth and 5x usage increase since the start of 2026. Acquiring Astral gives OpenAI direct ownership of tools that millions of Python developers already depend on. OpenAI plans to integrate Astral&amp;rsquo;s tools more deeply into Codex so the agent can interact with the toolchain developers already use.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Charlie Marsh on uv, Coding Agents, and the Changing Open Source Contract</title>
      <link>https://pydevtools.com/blog/charlie-marsh-test-set-interview/</link>
      <pubDate>Tue, 24 Feb 2026 12:00:00 -0500</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/charlie-marsh-test-set-interview/</guid>
      <description>&lt;p&gt;Charlie Marsh (founder of &lt;a href=&#34;https://astral.sh/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Astral&lt;/a&gt;, creator of &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;ruff&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;, and &lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt;) joined Michael Chow and Wes McKinney on &lt;a href=&#34;https://posit.co/thetestset/episode/charlie-marsh-more-productive-but-a-lot-less-fun/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;The Test Set&lt;/a&gt;. They covered uv&amp;rsquo;s adoption strategy, how coding agents are changing Astral&amp;rsquo;s development process, and what&amp;rsquo;s happening to open source when writing code becomes cheap.&lt;/p&gt;
&lt;h2&gt;uv&amp;rsquo;s compatibility layer was the point&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;uvs-compatibility-layer-was-the-point&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#uvs-compatibility-layer-was-the-point&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When uv first shipped, it only had &lt;code&gt;uv pip install&lt;/code&gt; and &lt;code&gt;uv venv&lt;/code&gt;. Some people found this odd. Charlie says it was deliberate:&lt;/p&gt;</description>
    </item>
    <item>
      <title>FOSDEM Talk: Modern Python Monorepo with uv, Workspaces, and prek</title>
      <link>https://pydevtools.com/blog/fosdem-talk-modern-python-monorepo/</link>
      <pubDate>Thu, 05 Feb 2026 08:00:00 -0500</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/fosdem-talk-modern-python-monorepo/</guid>
      <description>&lt;p&gt;Jarek Potiuk, Apache Airflow PMC member and the project&amp;rsquo;s top committer, gave a talk at FOSDEM 2026 on how Airflow manages its massive Python monorepo. The &lt;a href=&#34;https://ftp.belnet.be/mirror/FOSDEM/video/2026/ua2220/WE7NHM-modern-python-monorepo-apache-airflow.av1.webm&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;recording is now available&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Airflow ships over 120 separate Python distributions from a single repository, with 700+ dependencies and 3,600+ contributors. That scale forced the team to modernize their tooling. The talk walks through how they did it.&lt;/p&gt;
&lt;h2&gt;uv Workspaces for Monorepo Management&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;uv-workspaces-for-monorepo-management&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#uv-workspaces-for-monorepo-management&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The new setup centers on &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; workspaces. Rather than splitting 120 distributions across separate repositories or bundling everything into an unmanageable monolith, Airflow uses uv&amp;rsquo;s workspace feature to let distributions depend on each other via local sources instead of pulling from PyPI.&lt;/p&gt;</description>
    </item>
    <item>
      <title>uvx.sh: Install Python tools without uv or Python</title>
      <link>https://pydevtools.com/blog/uvx-sh-install-python-tools-without-uv-or-python/</link>
      <pubDate>Thu, 22 Jan 2026 12:00:00 -0500</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/uvx-sh-install-python-tools-without-uv-or-python/</guid>
      <description>&lt;p&gt;Astral has released &lt;a href=&#34;https://uvx.sh&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uvx.sh&lt;/a&gt;, a service that generates installation scripts for any Python tool on PyPI. With a single curl or PowerShell command, users can install tools like &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;ruff&lt;/a&gt; or &lt;a href=&#34;https://pydevtools.com/handbook/reference/pytest/&#34;&gt;pytest&lt;/a&gt; without having &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; or Python already installed on their system.&lt;/p&gt;
&lt;h2&gt;How It Works&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;how-it-works&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#how-it-works&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;uvx.sh dynamically generates installation scripts for any PyPI package. The URL pattern is simple:&lt;/p&gt;
&lt;div class=&#34;hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code&#34;&gt;

&lt;div&gt;&lt;pre&gt;&lt;code&gt;uvx.sh/{package}/install.sh     # macOS/Linux
uvx.sh/{package}/install.ps1    # Windows&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;hextra-code-copy-btn-container  hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0&#34;&gt;
  &lt;button
    class=&#34;hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50&#34;
    title=&#34;Copy code&#34;
    aria-label=&#34;Copy code&#34;
    data-copied-label=&#34;Copied!&#34;
  &gt;
    &lt;div class=&#34;hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
&lt;div class=&#34;hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
  &lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For example, to install ruff:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How uv Achieved Its Performance</title>
      <link>https://pydevtools.com/blog/how-uv-achieved-its-performance/</link>
      <pubDate>Fri, 26 Dec 2025 18:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/how-uv-achieved-its-performance/</guid>
      <description>&lt;p&gt;Andrew Nesbitt&amp;rsquo;s &lt;a href=&#34;https://nesbitt.io/2025/12/26/how-uv-got-so-fast.html&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&amp;ldquo;How uv got so fast&amp;rdquo;&lt;/a&gt; explains that &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;&amp;rsquo;s speed comes less from Rust and more from eliminating work entirely.&lt;/p&gt;
&lt;h2&gt;Speed Through Elimination&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;speed-through-elimination&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#speed-through-elimination&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Rather than optimizing slow code paths, &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; just removes them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No &lt;code&gt;.egg&lt;/code&gt; support&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;pip.conf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;No bytecode compilation by default&lt;/li&gt;
&lt;li&gt;Ignoring &lt;code&gt;requires-python&lt;/code&gt; upper bounds reduces resolver backtracking&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Rust-Independent Optimizations&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;rust-independent-optimizations&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#rust-independent-optimizations&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Many of &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;&amp;rsquo;s performance gains could work in &lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;pip&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parallel downloads instead of sequential&lt;/li&gt;
&lt;li&gt;Smart HTTP range requests for metadata&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; got fast by launching when PEP 658 infrastructure was ready and by skipping backward compatibility requirements that slow down &lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;pip&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Teaching LLMs Python Best Practices</title>
      <link>https://pydevtools.com/blog/teaching-llms-python-best-practices/</link>
      <pubDate>Fri, 21 Nov 2025 09:00:00 -0500</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/teaching-llms-python-best-practices/</guid>
      <description>&lt;p&gt;Large language models possess extensive Python knowledge from training data, yet they consistently struggle with modern tooling practices. Despite being trained on massive amounts of Python code, frontier models often default to outdated patterns like direct &lt;code&gt;python&lt;/code&gt; or &lt;code&gt;pip&lt;/code&gt; commands instead of using virtual environments and modern tools like &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;how is it, that despite every frontier LLM being insanely python maxxed they rarely use virtural envs, and even adding rules like &amp;quot;we are using uv, do everything with uv&amp;quot; they ignore it and think the system python is broken. like, every time. that&amp;#39;s actually an accomplishment&lt;/p&gt;</description>
    </item>
    <item>
      <title>Claude Code Hooks for uv Projects</title>
      <link>https://pydevtools.com/blog/claude-code-hooks-for-uv/</link>
      <pubDate>Tue, 11 Nov 2025 06:00:00 -0500</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/claude-code-hooks-for-uv/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://code.claude.com/docs/en/overview&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Claude Code&lt;/a&gt; supports &lt;a href=&#34;https://code.claude.com/docs/en/hooks-guide&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;custom hooks&lt;/a&gt; that guide the AI agent toward project-specific workflows. For Python projects using &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;, hooks can prevent Claude from falling back to &lt;code&gt;pip&lt;/code&gt; and &lt;code&gt;python&lt;/code&gt; commands.&lt;/p&gt;
&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200&#34;&gt;
  &lt;p class=&#34;hx:flex hx:items-center hx:font-medium&#34;&gt;&lt;svg height=16px class=&#34;hx:inline-block hx:align-middle hx:mr-2&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z&#34;/&gt;&lt;/svg&gt;Note&lt;/p&gt;

  &lt;div class=&#34;hx:w-full hx:min-w-0 hx:leading-7&#34;&gt;
    &lt;div class=&#34;hx:mt-6 hx:leading-7 hx:first:mt-0&#34;&gt;&lt;p&gt;This post builds on the &lt;a href=&#34;https://pydevtools.com/blog/interceptors/&#34;&gt;interceptor approach&lt;/a&gt; for teaching AI agents about uv. Interceptors provide runtime feedback; hooks prevent problematic commands before execution.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sync with uv: Eliminate Pre-commit Version Drift</title>
      <link>https://pydevtools.com/blog/sync-with-uv-eliminate-pre-commit-version-drift/</link>
      <pubDate>Fri, 26 Sep 2025 15:01:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/sync-with-uv-eliminate-pre-commit-version-drift/</guid>
      <description>&lt;p&gt;anaging tool versions across multiple configuration files creates persistent headaches in Python development. When you upgrade &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;ruff&lt;/a&gt; in your &lt;code&gt;pyproject.toml&lt;/code&gt;, you must remember to manually update the &lt;a href=&#34;https://pre-commit.com&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pre-commit&lt;/a&gt; hook version in &lt;code&gt;.pre-commit-config.yaml&lt;/code&gt;. This version drift causes inconsistent behavior between local development and &lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-set-up-pre-commit-hooks-for-a-python-project/&#34;&gt;pre-commit checks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/tsvikas/sync-with-uv&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;sync-with-uv&lt;/a&gt; library solves this by automatically synchronizing tool versions between &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;&lt;code&gt;uv&lt;/code&gt;&lt;/a&gt;&amp;rsquo;s &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-a-lock-file/&#34;&gt;lockfile&lt;/a&gt; and &lt;code&gt;.pre-commit-config.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;The Problem&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;the-problem&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#the-problem&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Consider this common scenario:&lt;/p&gt;
&lt;div class=&#34;hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code&#34;&gt;

&lt;div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# pyproject.toml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dependency-groups&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;lint&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ruff&amp;gt;=0.1.0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;mypy&amp;gt;=1.0.0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;hextra-code-copy-btn-container  hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0&#34;&gt;
  &lt;button
    class=&#34;hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50&#34;
    title=&#34;Copy code&#34;
    aria-label=&#34;Copy code&#34;
    data-copied-label=&#34;Copied!&#34;
  &gt;
    &lt;div class=&#34;hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
&lt;div class=&#34;hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
  &lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code&#34;&gt;

&lt;div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# .pre-commit-config.yaml&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;repos&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;https://github.com/astral-sh/ruff-pre-commit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;rev&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;v0.1.5 &lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Must manually sync with pyproject.toml&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;hooks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ruff&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;hextra-code-copy-btn-container  hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0&#34;&gt;
  &lt;button
    class=&#34;hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50&#34;
    title=&#34;Copy code&#34;
    aria-label=&#34;Copy code&#34;
    data-copied-label=&#34;Copied!&#34;
  &gt;
    &lt;div class=&#34;hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
&lt;div class=&#34;hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
  &lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When &lt;code&gt;uv lock --upgrade&lt;/code&gt; updates ruff to 0.1.8, the pre-commit hook stays pinned to 0.1.5. This creates confusing behavior where local checks differ from pre-commit results. The same gap applies to &lt;a href=&#34;https://pydevtools.com/handbook/reference/mypy/&#34;&gt;mypy&lt;/a&gt; and any other tool pinned in both files.&lt;/p&gt;</description>
    </item>
    <item>
      <title>uv format: Code Formatting Comes to uv (experimentally!)</title>
      <link>https://pydevtools.com/blog/uv-format-code-formatting-comes-to-uv-experimentally/</link>
      <pubDate>Thu, 21 Aug 2025 16:08:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/uv-format-code-formatting-comes-to-uv-experimentally/</guid>
      <description>&lt;p&gt;The latest &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; release (&lt;a href=&#34;https://github.com/astral-sh/uv/blob/main/CHANGELOG.md#0813&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;0.8.13&lt;/a&gt;) quietly introduced an experimental new command that Python developers have been waiting for: &lt;code&gt;uv format&lt;/code&gt;. This addition brings code formatting directly into uv&amp;rsquo;s toolkit, eliminating the need to juggle multiple tools for basic Python development workflows.&lt;/p&gt;
&lt;h2&gt;What is uv format?&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;what-is-uv-format&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#what-is-uv-format&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;uv format&lt;/code&gt; command provides Python code formatting through uv&amp;rsquo;s interface. Under the hood, it calls &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;Ruff&lt;/a&gt;&amp;rsquo;s formatter to automatically style your code according to consistent standards.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How Python&#39;s RFC Process Paved the Way for uv, Ruff, and Ty</title>
      <link>https://pydevtools.com/blog/peps-and-astral/</link>
      <pubDate>Fri, 01 Aug 2025 15:22:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/peps-and-astral/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://astral.sh/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Astral&lt;/a&gt;, an independent startup, has taken the Python world by storm over the last few years with three fast, robust Python developer tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;ruff&lt;/a&gt; (linter and formatter)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; (packaging and project management)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt; (static type checker, still under development)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These tools came from the mind of Charlie Marsh, who is neither a Python core developer nor directed by the Python Steering Council. While being independently developed, these tools work seamlessly within the established Python ecosystem. This success stems partly from Astral&amp;rsquo;s attention to guidelines established by the Python Enhancement Proposal (&lt;a href=&#34;https://pydevtools.com/handbook/explanation/pep/&#34;&gt;PEP&lt;/a&gt;) process over the last twenty-five years.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Interview with the Pybites podcast</title>
      <link>https://pydevtools.com/blog/interview-with-the-pybites-podcast/</link>
      <pubDate>Wed, 30 Jul 2025 09:20:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/interview-with-the-pybites-podcast/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/bbelderbos/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Bob Belderbos&lt;/a&gt; invited me on the &lt;a href=&#34;https://tdhopper.com/blog/interview-with-the-pybites-podcast/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Pybites podcast where I talked about the handbook, uv, and more&lt;/a&gt;. I hope you enjoy it.&lt;/p&gt;
&lt;iframe data-testid=&#34;embed-iframe&#34; style=&#34;border-radius:12px&#34; src=&#34;https://open.spotify.com/embed/episode/7xyb2HUcqPEpvLYo8qjQrV?utm_source=generator&amp;theme=0&amp;t=0&#34; width=&#34;100%&#34; height=&#34;352&#34; frameBorder=&#34;0&#34; allowfullscreen=&#34;&#34; allow=&#34;autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture&#34; loading=&#34;lazy&#34;&gt;&lt;/iframe&gt;</description>
    </item>
    <item>
      <title>Use Interceptors to teach Claude Code to use uv</title>
      <link>https://pydevtools.com/blog/interceptors/</link>
      <pubDate>Mon, 28 Jul 2025 09:34:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/interceptors/</guid>
      <description>&lt;p&gt;AI coding agents like Claude Code, Cursor, or GitHub Copilot often default to using system Python interpreters instead of using &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://x.com/mitsuhiko/status/1949093355373142400&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Armin Ronacher, creator of Flask and Jinja, shared an elegant solution to this problem&lt;/a&gt;: creating dummy Python interpreter that actively redirect AI agents toward better tooling choices.&lt;/p&gt;
&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-green-200 hx:bg-green-100 hx:text-green-900 hx:dark:border-green-200/30 hx:dark:bg-green-900/30 hx:dark:text-green-200&#34;&gt;
  &lt;p class=&#34;hx:flex hx:items-center hx:font-medium&#34;&gt;&lt;svg height=16px class=&#34;hx:inline-block hx:align-middle hx:mr-2&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z&#34;/&gt;&lt;/svg&gt;Tip&lt;/p&gt;</description>
    </item>
    <item>
      <title>uvhow: Get uv upgrade instructions for your uv install</title>
      <link>https://pydevtools.com/blog/uvhow-get-uv-upgrade-instructions-for-your-uv-install/</link>
      <pubDate>Tue, 22 Jul 2025 20:18:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/uvhow-get-uv-upgrade-instructions-for-your-uv-install/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve released &lt;a href=&#34;https://github.com/python-developer-tooling-handbook/uvhow&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uvhow&lt;/a&gt;, a simple command-line tool that detects how &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; was installed on your system and provides the correct upgrade instructions.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; can be &lt;a href=&#34;https://docs.astral.sh/uv/getting-started/installation/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;installed through multiple methods&lt;/a&gt;. When it&amp;rsquo;s time to upgrade, users often struggle to remember which installation method they used, leading to confusion about the correct upgrade command.&lt;/p&gt;
&lt;p&gt;uvhow automatically detects your uv installation method and tells you exactly how to upgrade:&lt;/p&gt;
&lt;div class=&#34;hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code&#34;&gt;

&lt;div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uvx uvhow&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;hextra-code-copy-btn-container  hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0&#34;&gt;
  &lt;button
    class=&#34;hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50&#34;
    title=&#34;Copy code&#34;
    aria-label=&#34;Copy code&#34;
    data-copied-label=&#34;Copied!&#34;
  &gt;
    &lt;div class=&#34;hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
&lt;div class=&#34;hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
  &lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The tool works across Windows, macOS, and Linux and supports all major installation methods including:&lt;/p&gt;</description>
    </item>
    <item>
      <title>uv 0.8 Release: Automatic Python Installation to PATH</title>
      <link>https://pydevtools.com/blog/uv-0-8-release-automatic-python-installation-to-path/</link>
      <pubDate>Sat, 19 Jul 2025 09:27:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/uv-0-8-release-automatic-python-installation-to-path/</guid>
      <description>&lt;p&gt;[!TIP]&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-upgrade-uv/&#34;&gt;Check out our guide to upgrading uv&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; 0.8 stabilizes one of the most significant workflow improvements in Python tooling: automatic installation of Python executables to your PATH. This means you can finally install Python versions with &lt;code&gt;uv python install&lt;/code&gt; and use them system-wide without wrestling with environment activation.&lt;/p&gt;
&lt;h2&gt;Global Python Access Without the Hassle&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;global-python-access-without-the-hassle&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#global-python-access-without-the-hassle&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The headline feature addresses a long-standing frustration in Python development. When you run:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python is good now!</title>
      <link>https://pydevtools.com/blog/python-is-good-now/</link>
      <pubDate>Wed, 16 Jul 2025 13:43:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/python-is-good-now/</guid>
      <description>&lt;p&gt;love &lt;a href=&#34;https://www.linkedin.com/in/cesarsotovalero/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;César Soto Valero&lt;/a&gt;&amp;rsquo;s recent post &lt;a href=&#34;https://www.cesarsotovalero.net/blog/i-am-switching-to-python-and-actually-liking-it.html&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;I&amp;rsquo;m Switching to Python and Actually Liking It&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;To my great surprise, I’ve found that Python, and everything around it, has really improved a lot over the last decades.&lt;/p&gt;
&lt;p&gt;Here are just three examples:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Python has created a very complete ecosystem of libraries and tools for processing and analyzing data.&lt;/li&gt;
&lt;li&gt;Python has gotten faster with optimized static compilers like Cython.&lt;/li&gt;
&lt;li&gt;Python has done a good job of hiding its legacy ugliness (such as &lt;code&gt;__init__&lt;/code&gt;, &lt;code&gt;__new__&lt;/code&gt;, and similar aberrations), sweetening its syntax to accommodate developers with good taste.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cesarsotovalero.net/blog/i-am-switching-to-python-and-actually-liking-it.html&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Read the whole post&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hynek Schlawack&#39;s uv Workflow Guide</title>
      <link>https://pydevtools.com/blog/fast-and-boring-uv/</link>
      <pubDate>Mon, 07 Jul 2025 10:21:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/fast-and-boring-uv/</guid>
      <description>&lt;p&gt;{&amp;lt; youtube TiBIjouDGuI &amp;gt;}}&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://hynek.me/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Hynek Schlawack&lt;/a&gt;&amp;rsquo;s new video &lt;a href=&#34;https://youtu.be/TiBIjouDGuI&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&amp;ldquo;uv: Making Python Local Workflows FAST and BORING in 2025&amp;rdquo;&lt;/a&gt; demonstrates practical &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; workflows using real  examples.&lt;/p&gt;
&lt;p&gt;He covers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Replacing &lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;pip&lt;/a&gt;/&lt;a href=&#34;https://pydevtools.com/handbook/reference/virtualenv/&#34;&gt;virtualenv&lt;/a&gt;/&lt;a href=&#34;https://pydevtools.com/handbook/reference/pyenv/&#34;&gt;pyenv&lt;/a&gt; with a single tool&lt;/li&gt;
&lt;li&gt;Dependency management and lock files&lt;/li&gt;
&lt;li&gt;Testing and linting integration&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://just.systems/man/en/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;just&lt;/code&gt;&lt;/a&gt; integration for cross-platform commands&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you missed Part 1 of Hynek&amp;rsquo;s series, &lt;a href=&#34;https://www.youtube.com/watch?v=mFyE9xgeKcA&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;it&amp;rsquo;s available here&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The uv build backend is now stable</title>
      <link>https://pydevtools.com/blog/uv-build-backend/</link>
      <pubDate>Thu, 03 Jul 2025 01:29:29 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/uv-build-backend/</guid>
      <description>&lt;p&gt;For about a year, &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; has had a &lt;code&gt;uv build&lt;/code&gt; command for generating distributable &lt;a href=&#34;https://pydevtools.com/handbook/reference/wheel/&#34;&gt;wheels&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/sdist/&#34;&gt;source distributions&lt;/a&gt; on &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-pypi/&#34;&gt;pypi&lt;/a&gt; and elsewhere.&lt;/p&gt;
&lt;p&gt;However, uv has relied on other tools for the &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-a-build-backend/&#34;&gt;build backend&lt;/a&gt;, i.e. the actual piece constructing the wheel or sdist as defined by &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-pep-517/&#34;&gt;PEP 517&lt;/a&gt;. By default, uv uses &lt;a href=&#34;https://pydevtools.com/handbook/reference/hatch/&#34;&gt;hatchling&lt;/a&gt; as the build backend.&lt;/p&gt;
&lt;p&gt;As of this week, the uv team has now declared the uv build backend as stable and, most notably, really, really fast. &lt;a href=&#34;https://x.com/charliermarsh/status/1940583972607873226&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Charlie Marsh&amp;rsquo;s benchmarks&lt;/a&gt; suggest that it&amp;rsquo;s 10 to 35 times faster than &lt;a href=&#34;https://pydevtools.com/handbook/reference/flit/&#34;&gt;flit&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/hatch/&#34;&gt;hatchling&lt;/a&gt;, and &lt;a href=&#34;https://pydevtools.com/handbook/reference/setuptools/&#34;&gt;setuptools&lt;/a&gt;. While I&amp;rsquo;ve never really needed my package builds to be faster, I&amp;rsquo;ve learned that &lt;a href=&#34;https://x.com/tdhopper/status/1850885052894196149&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;faster tools often enable new things I didn&amp;rsquo;t imagine possible&lt;/a&gt;; I&amp;rsquo;m interested to see what those might be here.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Managing Python Versions In Your uv Projects</title>
      <link>https://pydevtools.com/blog/managing-python-versions-in-your-uv-projects/</link>
      <pubDate>Wed, 25 Jun 2025 10:09:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/managing-python-versions-in-your-uv-projects/</guid>
      <description>&lt;p&gt;One of the many ways the package manager &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; has changed Python is by making it painless to install and run different versions of the Python interpreter.&lt;/p&gt;
&lt;p&gt;That said, I&amp;rsquo;ve occasionally gotten tripped up configuring this correctly in my development environments. I&amp;rsquo;ve written a few articles to try to clarify things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-install-python-with-uv/&#34;&gt;How to install Python with uv&lt;/a&gt;. Before you can pin a Python version, you need to have it installed.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-a-python-version-file/&#34;&gt;What is a .python-version file?&lt;/a&gt; Not unique to uv, a .python-version file specifies which Python version should be used for a particular project or directory.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-a-python-version-file/#python-version-vs-requires-python-in-pyprojecttoml&#34;&gt;.python-version vs requires-python in pyproject.toml&lt;/a&gt;. The former is for development environments, while the latter is for package metadata.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-change-the-python-version-of-a-uv-project/&#34;&gt;How to change the python version of a uv project&lt;/a&gt;. If &lt;code&gt;uv run&lt;/code&gt; isn&amp;rsquo;t using the version of Python you expected or wanted, here is what you can do.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The goal of the handbook is to help you understand the ecosystem of tools used to make Python development easier and more productive. What are some missing topics you&amp;rsquo;d like to see included?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why uv makes Make less essential for Python projects</title>
      <link>https://pydevtools.com/blog/why-uv-makes-make-less-essential-for-python-projects/</link>
      <pubDate>Fri, 04 Apr 2025 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/why-uv-makes-make-less-essential-for-python-projects/</guid>
      <description>&lt;p&gt;or years, I&amp;rsquo;ve been a strong advocate for using &lt;a href=&#34;https://en.wikipedia.org/wiki/Make_%28software%29&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Makefiles&lt;/a&gt; in Python projects. They&amp;rsquo;ve provided a consistent interface for common tasks like environment setup (&lt;code&gt;make venv&lt;/code&gt;), testing (&lt;code&gt;make test&lt;/code&gt;), and code formatting (&lt;code&gt;make format&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;But with the advent of &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;, I&amp;rsquo;m reconsidering this approach. Make might be becoming less essential in the modern Python ecosystem.&lt;/p&gt;
&lt;h2&gt;The Speed Factor&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;the-speed-factor&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#the-speed-factor&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of Make&amp;rsquo;s traditional strengths is avoiding unnecessary work. A properly configured Makefile only rebuilds targets when dependencies change. This was valuable when setting up Python environments, for example:&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Python Tooling Revolution</title>
      <link>https://pydevtools.com/blog/python-tooling-revolution/</link>
      <pubDate>Wed, 02 Apr 2025 16:48:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/python-tooling-revolution/</guid>
      <description>&lt;p&gt;Python development is experiencing a tooling revolution thanks to &lt;a href=&#34;https://astral.sh/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Astral&lt;/a&gt;&amp;rsquo;s &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;ruff&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;. Lewis Gaul&amp;rsquo;s blog examines how these tools are transforming Python workflows with exceptional speed and intelligent design.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;When trying ruff check the benefits were immediately obvious: performance is incredible, provides a superset of the pylint rules, reporting of errors is very clear, configuration is straightforward, documentation is excellent&amp;hellip;and above all else the &amp;ndash;fix flag is a huge win to automatically fix certain rule violations.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Simple, Modern Python</title>
      <link>https://pydevtools.com/blog/simple-modern-uv/</link>
      <pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/simple-modern-uv/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://x.com/ojoshe/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Joshua Levy&lt;/a&gt; recently shared his enthusiasm for &lt;code&gt;uv&lt;/code&gt;, Astral&amp;rsquo;s Python package manager, along with a practical template for new projects using this tool. &lt;a href=&#34;https://x.com/ojoshe/status/1901380005084700793&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;His thread on X&lt;/a&gt; highlights both technical advantages and philosophical approaches to modern Python development.&lt;/p&gt;
&lt;h2&gt;Key Points from Levy&amp;rsquo;s UV Template&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;key-points-from-levys-uv-template&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#key-points-from-levys-uv-template&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Levy has created a &lt;a href=&#34;https://github.com/jlevy/simple-modern-uv&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;simple-modern-uv&lt;/a&gt;, &lt;a href=&#34;https://copier.readthedocs.io/en/stable/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Copier&lt;/a&gt; template that combines minimal but essential tools for Python projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uses &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; for package management&lt;/li&gt;
&lt;li&gt;Incorporates &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;ruff&lt;/a&gt; for linting and formatting (replacing Black and isort)&lt;/li&gt;
&lt;li&gt;Includes &lt;a href=&#34;https://pydevtools.com/handbook/reference/mypy/&#34;&gt;mypy&lt;/a&gt;, &lt;a href=&#34;https://github.com/codespell-project/codespell&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;codespell&lt;/a&gt;, and &lt;a href=&#34;https://pydevtools.com/handbook/reference/pytest/&#34;&gt;pytest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Provides &lt;a href=&#34;https://docs.github.com/en/actions&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub Actions&lt;/a&gt; configuration&lt;/li&gt;
&lt;li&gt;Uses &lt;a href=&#34;https://copier.readthedocs.io/en/stable/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Copier&lt;/a&gt; for template management&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why uv Matters Beyond Speed&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;why-uv-matters-beyond-speed&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#why-uv-matters-beyond-speed&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While uv&amp;rsquo;s performance is impressive, Levy emphasizes that its real value lies in dependency management fundamentals:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dependabot Now Supports uv</title>
      <link>https://pydevtools.com/blog/dependabot-uv-support/</link>
      <pubDate>Fri, 14 Mar 2025 09:26:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/dependabot-uv-support/</guid>
      <description>&lt;p&gt;As of March 13, 2025, &lt;a href=&#34;https://github.blog/changelog/2025-03-13-dependabot-version-updates-now-support-uv-in-general-availability/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Dependabot officially supports uv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.github.com/en/code-security/dependabot&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Dependabot&lt;/a&gt; monitors repositories for outdated or insecure dependencies and creates pull requests to update them. GitHub&amp;rsquo;s tool supports npm, pip, Maven, Docker, and now uv.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why Doesn&#39;t the Authoritative Python Packaging Guide Mention the Best Thing that&#39;s Happened to Python Packaging?</title>
      <link>https://pydevtools.com/blog/uv-not-in-ppug/</link>
      <pubDate>Thu, 27 Feb 2025 14:56:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/uv-not-in-ppug/</guid>
      <description>&lt;p&gt;Despite &lt;a href=&#34;https://docs.astral.sh/uv/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv&lt;/a&gt;&amp;rsquo;s meteoric rise and widespread adoption in the Python community over the last year, the excellent and official &lt;a href=&#34;https://packaging.python.org/en/latest/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Python Packaging User Guide&lt;/a&gt; (PPUG) at &lt;a href=&#34;https://packaging.python.org/en/latest/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;packaging.python.org&lt;/a&gt; makes no mention of it. Understanding why this is requires some background knowledge and unveils understanding of the modern Python developer tooling ecosystem.&lt;/p&gt;
&lt;h2&gt;uv&amp;rsquo;s Rise&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;uvs-rise&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#uvs-rise&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Since its introduction in early 2024, uv has rapidly gained traction as a high-performance alternative to existing Python tooling. uv delivers 10-100x faster package operations than traditional tools while consolidating functionality previously spread across multiple utilities (pip, pip-tools, virtualenv, pyenv, and more). Its performance advantages, cross-platform support, and unified approach have made it increasingly popular among Python developers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why Doesn&#39;t the Authoritative Python Packaging Guide Mention the Best Thing that&#39;s Happened to Python Packaging?</title>
      <link>https://pydevtools.com/handbook/explanation/uv-not-in-ppug/</link>
      <pubDate>Thu, 27 Feb 2025 14:56:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/explanation/uv-not-in-ppug/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; is the most widely adopted new Python tool in years, yet the &lt;a href=&#34;https://pydevtools.com/handbook/reference/python-packaging-user-guide/&#34;&gt;Python Packaging User Guide&lt;/a&gt; (PPUG) makes no mention of it.&lt;/p&gt;
&lt;h2&gt;What does uv replace?&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;what-does-uv-replace&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#what-does-uv-replace&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;uv delivers 10-100x faster package operations than &lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;pip&lt;/a&gt; while consolidating functionality previously spread across &lt;a href=&#34;https://pydevtools.com/handbook/reference/pip-tools/&#34;&gt;pip-tools&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/virtualenv/&#34;&gt;virtualenv&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyenv/&#34;&gt;pyenv&lt;/a&gt;, and more into a single tool. Since its introduction in early 2024, it has become the default recommendation in many Python teams and communities.&lt;/p&gt;
&lt;h2&gt;Who controls packaging.python.org?&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;who-controls-packagingpythonorg&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#who-controls-packagingpythonorg&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Python Packaging Authority (PyPA) started in 2011 as a working group focused on maintaining specific packaging tools, particularly pip and virtualenv. Its name suggests broad authority over Python packaging, but its scope has always been narrower.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Production Experiences with uv</title>
      <link>https://pydevtools.com/blog/uv-in-prod/</link>
      <pubDate>Wed, 26 Feb 2025 08:48:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/uv-in-prod/</guid>
      <description>&lt;p&gt;Yesterday on Reddit, &lt;a href=&#34;https://www.reddit.com/r/Python/comments/1ixryec/anyone_used_uv_package_manager_in_production/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;batman-iphone&lt;/a&gt; asked:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Anyone used &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; package manager in production&lt;/p&gt;
&lt;p&gt;Is it reliable to use it in production as it is comparatively new in the market.&lt;/p&gt;
&lt;p&gt;Also, are there any disadvantages that I should be aware of before pitching it to my manager?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Given that the tool was introduced just over a year ago, its rate of adoption has been wild.&lt;/p&gt;
&lt;p&gt;Here is my summary of the discussion:&lt;/p&gt;
&lt;h2&gt;uv Pros&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;uv-pros&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#uv-pros&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;Real Performance Gains&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;real-performance-gains&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#real-performance-gains&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Multiple developers reported dramatic performance improvements, e.g.,&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why Use uv Projects Instead of requirements.txt?</title>
      <link>https://pydevtools.com/blog/requirementstxt-vs-pyprojecttoml/</link>
      <pubDate>Wed, 19 Feb 2025 09:17:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/requirementstxt-vs-pyprojecttoml/</guid>
      <description>&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:rounded-lg hx:border hx:py-2 hx:ltr:pr-4 hx:rtl:pl-4 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200&#34;&gt;
  &lt;div class=&#34;hx:ltr:pl-3 hx:ltr:pr-2 hx:rtl:pr-3 hx:rtl:pl-2&#34;&gt;&lt;svg height=1.2em class=&#34;hx:inline-block hx:align-middle&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;

  &lt;div class=&#34;hx:w-full hx:min-w-0 hx:leading-7&#34;&gt;
    &lt;div class=&#34;hx:mt-6 hx:leading-7 hx:first:mt-0&#34;&gt;This is an excerpt from the forthcoming Python Developer&amp;rsquo;s Tool Handbook. The handbook provides comprehensive guidance on Python tooling and best practices for modern Python development.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The Python ecosystem offers two main approaches to managing project dependencies: the traditional requirements.txt file and the newer &lt;a href=&#34;https://packaging.python.org/en/latest/guides/writing-pyproject-toml/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pyproject.toml&lt;/a&gt; standard. Understanding the strengths and limitations of each helps inform better choices for Python development.&lt;/p&gt;</description>
    </item>
    <item>
      <title>bitecode.dev&#39;s &#34;A year of uv&#34;</title>
      <link>https://pydevtools.com/blog/year-of-uv/</link>
      <pubDate>Tue, 18 Feb 2025 09:53:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/year-of-uv/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://docs.astral.sh/uv/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv&lt;/a&gt; hit its one-year mark, and bitecode.dev published &lt;a href=&#34;https://www.bitecode.dev/p/a-year-of-uv-pros-cons-and-should&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;a thorough retrospective&lt;/a&gt; on how it&amp;rsquo;s held up.&lt;/p&gt;
&lt;p&gt;The highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solves Python bootstrapping by installing without Python and working the same across platforms&lt;/li&gt;
&lt;li&gt;Fast - tasks that took minutes now take seconds&lt;/li&gt;
&lt;li&gt;More reliable dependency resolution than alternatives&lt;/li&gt;
&lt;li&gt;Works with existing tools without friction&lt;/li&gt;
&lt;li&gt;Error messages tell you what went wrong and what to do&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The article lists five situations where uv might not fit, but these feel overly cautious. Speed, reliability, and simpler workflows make uv worth adopting for any team that can.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Flexible Python Version Management with uv and tox</title>
      <link>https://pydevtools.com/blog/flexible-version-management-for-tox/</link>
      <pubDate>Wed, 12 Feb 2025 10:20:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/flexible-version-management-for-tox/</guid>
      <description>&lt;p&gt;When working with Python projects that use &lt;a href=&#34;https://pydevtools.com/handbook/reference/tox/&#34;&gt;tox&lt;/a&gt; for testing, you may encounter version mismatch errors like:&lt;/p&gt;
&lt;div class=&#34;hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code&#34;&gt;

&lt;div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;lint-format: skipped because could not find python interpreter with spec(s): python3.8
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;hextra-code-copy-btn-container  hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0&#34;&gt;
  &lt;button
    class=&#34;hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50&#34;
    title=&#34;Copy code&#34;
    aria-label=&#34;Copy code&#34;
    data-copied-label=&#34;Copied!&#34;
  &gt;
    &lt;div class=&#34;hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
&lt;div class=&#34;hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
  &lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This happens when tox expects a specific Python version that isn&amp;rsquo;t available in your environment. Traditionally, this would require:&lt;/p&gt;</description>
    </item>
    <item>
      <title>One Line Command to Launch a Notebook with Pytorch</title>
      <link>https://pydevtools.com/blog/one-line-command-to-launch-a-notebook-with-pytorch/</link>
      <pubDate>Wed, 15 Jan 2025 14:18:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/one-line-command-to-launch-a-notebook-with-pytorch/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://docs.astral.sh/uv/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv&lt;/a&gt; is changing how accessible Python is for new users.&lt;/p&gt;
&lt;p&gt;If you want to try out &lt;a href=&#34;https://pytorch.org&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pytorch&lt;/a&gt; in a Jupyter Notebook, you can &lt;a href=&#34;https://docs.astral.sh/uv/getting-started/installation/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;install uv&lt;/a&gt; and then run this single line command:&lt;/p&gt;
&lt;div class=&#34;hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code&#34;&gt;

&lt;div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv run --python 3.12 --with &lt;span class=&#34;s2&#34;&gt;&amp;#34;torch~=2.4&amp;#34;&lt;/span&gt; --with jupyter --with &lt;span class=&#34;s2&#34;&gt;&amp;#34;numpy&amp;lt;2&amp;#34;&lt;/span&gt; jupyter lab&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;hextra-code-copy-btn-container  hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0&#34;&gt;
  &lt;button
    class=&#34;hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50&#34;
    title=&#34;Copy code&#34;
    aria-label=&#34;Copy code&#34;
    data-copied-label=&#34;Copied!&#34;
  &gt;
    &lt;div class=&#34;hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
&lt;div class=&#34;hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
  &lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;uv will grab all your dependencies (including Python 3.12, if you don&amp;rsquo;t have it installed), install them in an isolated environment, and launch Jupyter Lab.&lt;/p&gt;</description>
    </item>
    <item>
      <title>&#34;uv: Towards a unified vision for Python tooling&#34;</title>
      <link>https://pydevtools.com/blog/uv-towards-a-unified-vision-for-python-tooling/</link>
      <pubDate>Fri, 27 Dec 2024 10:49:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/uv-towards-a-unified-vision-for-python-tooling/</guid>
      <description>&lt;p&gt;This is a great post](&lt;a href=&#34;https://thedataquarry.com/posts/towards-a-unified-python-toolchain/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://thedataquarry.com/posts/towards-a-unified-python-toolchain/&lt;/a&gt;) by &lt;a href=&#34;https://www.linkedin.com/in/prrao87/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Prashanth Rao&lt;/a&gt; on the unified vision that uv brings for Python package and project management. As he shares, the tools in this space have been improving over the last 15 years, but uv is a step-change for usability.&lt;/p&gt;
&lt;p&gt;The most remarkable aspect of uv is the list of steps he shares that (might) happen when you call &lt;code&gt;uv run hello.py&lt;/code&gt;:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;ol&gt;
&lt;li&gt;Installs Python if it’s not already installed&lt;/li&gt;
&lt;li&gt;Creates and activates the virtual environment&lt;/li&gt;
&lt;li&gt;Installs the dependencies&lt;/li&gt;
&lt;li&gt;Runs the code&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;And all of this happens with blazing speed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Effective Python Developer Tooling in December 2024</title>
      <link>https://pydevtools.com/blog/effective-python-developer-tooling-in-december-2024/</link>
      <pubDate>Fri, 20 Dec 2024 19:25:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/effective-python-developer-tooling-in-december-2024/</guid>
      <description>&lt;p&gt;I have been writing Python for 14 years next month. When I started, people were still using easy_install to install egg-based packages for Python 2.7 and nobody had heard about Conda yet, much less uv. The Python tool ecosystem has changed since. Many people are confused by the &lt;a href=&#34;https://xkcd.com/1987/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;fragmentation&lt;/a&gt; in the ecosystem, but we have better tooling for Python today than we&amp;rsquo;ve ever had before.&lt;/p&gt;
&lt;p&gt;A friend recently invited me to give a talk to his team about Python tooling. In the presentation, I shared some principles of Python tooling and developer efficiency, some anti-patterns I&amp;rsquo;ve observed, recommended practices, and an opinionated list of tools I like in December 2024. What follows is a summary of that talk.&lt;/p&gt;</description>
    </item>
    <item>
      <title>uv 0.3: One command line to rule them all (almost)</title>
      <link>https://pydevtools.com/blog/uv-0-3-one-command-line-to-rule-them-all-almost/</link>
      <pubDate>Wed, 21 Aug 2024 09:30:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/uv-0-3-one-command-line-to-rule-them-all-almost/</guid>
      <description>&lt;p&gt;Yesterday, &lt;a href=&#34;https://x.com/charliermarsh&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Charlie Marsh&lt;/a&gt; and his team at &lt;a href=&#34;https://astral.sh&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Astral&lt;/a&gt; released &lt;a href=&#34;https://github.com/astral-sh/uv/blob/main/CHANGELOG.md#030&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv 0.3.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For those who may have missed it, &lt;a href=&#34;https://pydevtools.com/blog/uv-got-to-keep-up-a-new-installer-announced/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv was released earlier this year&lt;/a&gt; primarily as a blazing-fast replacement for &lt;a href=&#34;https://packaging.python.org/en/latest/tutorials/packaging-projects/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pip&lt;/a&gt; for installing Python packages.&lt;/p&gt;
&lt;p&gt;This new release provides &lt;a href=&#34;https://docs.astral.sh/uv/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;new documentation&lt;/a&gt; and a host of new functionality.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://astral.sh/blog/uv-unified-python-packaging&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Charlie Marsh&lt;/a&gt; and &lt;a href=&#34;https://simonwillison.net/2024/Aug/20/uv-unified-python-packaging/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Simon Willison&lt;/a&gt; have written helpful posts about the new functionality.&lt;/p&gt;
&lt;p&gt;I thought it&amp;rsquo;d be helpful to illustrate how the current uv functionality compares to existing tools:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;uv Command&lt;/th&gt;
          &lt;th&gt;Alternative to&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://docs.astral.sh/uv/getting-started/features/#the-pip-interface&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv pip&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;pip&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/pip-tools/&#34;&gt;pip-tools&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://docs.astral.sh/uv/getting-started/features/#the-pip-interface&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv venv&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/venv/&#34;&gt;venv&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/virtualenv/&#34;&gt;virtualenv&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://docs.astral.sh/uv/guides/tools/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv tool&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/pipx/&#34;&gt;pipx&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://docs.astral.sh/uv/guides/projects/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv init&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/poetry/&#34;&gt;Poetry&lt;/a&gt;/&lt;a href=&#34;https://pydevtools.com/handbook/reference/pdm/&#34;&gt;PDM&lt;/a&gt; (partially)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://docs.astral.sh/uv/guides/install-python/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv python&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/pyenv/&#34;&gt;pyenv&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://docs.astral.sh/uv/guides/scripts/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv run&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;nothing!&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;uv only &lt;em&gt;partially&lt;/em&gt; replicates Poetry and PDM because it has yet to implement package building and publishing, only project management. However, &lt;a href=&#34;https://docs.astral.sh/uv/guides/publish/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;they provide simple commands&lt;/a&gt; for publishing using existing tools and a uv project.&lt;/p&gt;</description>
    </item>
    <item>
      <title>uv got to keep up: a new installer announced!</title>
      <link>https://pydevtools.com/blog/uv-got-to-keep-up-a-new-installer-announced/</link>
      <pubDate>Fri, 16 Feb 2024 01:29:29 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/uv-got-to-keep-up-a-new-installer-announced/</guid>
      <description>&lt;p&gt;Astral, &lt;a href=&#34;https://twitter.com/charliermarsh&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Charlie Marsh&lt;/a&gt;&amp;rsquo;s company best known for Ruff, announced &lt;a href=&#34;https://github.com/astral-sh/uv&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv&lt;/a&gt; today, &amp;ldquo;an extremely fast Python package installer and resolver, written in Rust.&amp;rdquo; uv is intended as a &amp;ldquo;drop-in replacement for pip and &lt;a href=&#34;https://pip-tools.readthedocs.io/en/stable/cli/pip-compile/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pip-compile&lt;/a&gt;.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Some early feedback looks very encouraging, e.g.,&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-conversation=&#34;none&#34; data-dnt=&#34;true&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;It looks like uv will bring dependency install times for &lt;a href=&#34;https://twitter.com/dagster?ref_src=twsrc%5Etfw&#34;&gt;@dagster&lt;/a&gt; down from 1m26s to 18s, and a blistering 29ms with cache!&lt;a href=&#34;https://t.co/z7MXOFKbiw&#34;&gt;https://t.co/z7MXOFKbiw&lt;/a&gt;&lt;br&gt;&lt;br&gt;Amazing work &lt;a href=&#34;https://twitter.com/charliermarsh?ref_src=twsrc%5Etfw&#34;&gt;@charliermarsh&lt;/a&gt; and team!&lt;/p&gt;&amp;mdash; colton (@coltonpadden) &lt;a href=&#34;https://twitter.com/coltonpadden/status/1758239894881661327?ref_src=twsrc%5Etfw&#34;&gt;February 15, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-dnt=&#34;true&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;I just swapped a Docker image from &amp;quot;pip install --no-cache-dir -r requirements.txt&amp;quot; to &amp;quot;uv pip install --no-cache -r requirements.txt&amp;quot; and the build time went from 67.8s to 15.4s. Absolutely insane. &lt;a href=&#34;https://t.co/VwOIfIpnQP&#34;&gt;https://t.co/VwOIfIpnQP&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Quick start guide for Python development on a Mac</title>
      <link>https://pydevtools.com/blog/python-quickstart/</link>
      <pubDate>Mon, 05 Feb 2024 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/python-quickstart/</guid>
      <description>&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200&#34;&gt;
  &lt;p class=&#34;hx:flex hx:items-center hx:font-medium&#34;&gt;&lt;svg height=16px class=&#34;hx:inline-block hx:align-middle hx:mr-2&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z&#34;/&gt;&lt;/svg&gt;Note&lt;/p&gt;

  &lt;div class=&#34;hx:w-full hx:min-w-0 hx:leading-7&#34;&gt;
    &lt;div class=&#34;hx:mt-6 hx:leading-7 hx:first:mt-0&#34;&gt;&lt;p&gt;For a modern approach, consider &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;, which handles Python installation, project management, and dependency management in a single tool. The pyenv + Poetry workflow described below remains valid, but uv offers a more streamlined experience.&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
