<?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/handbook/topics/uv/</link>
    <description>Python&#39;s fastest package and project manager. Install, configure, and migrate to uv.</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Thu, 09 Apr 2026 14:11:37 -0400</lastBuildDate>
    
	  <atom:link href="https://pydevtools.com/handbook/topics/uv/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>uv: A Complete Guide to Python&#39;s Fastest Package Manager</title>
      <link>https://pydevtools.com/handbook/explanation/uv-complete-guide/</link>
      <pubDate>Fri, 08 May 2026 18:28:09 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/explanation/uv-complete-guide/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; replaces a half-dozen traditional Python tools with a single binary: interpreter installation, virtual environments, dependency management, version locking, CLI tools, and code formatting. In benchmarks, it creates virtual environments 50x faster than &lt;code&gt;python -m venv&lt;/code&gt; and installs packages 5-40x faster than pip depending on cache state.&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;</description>
    </item>
    <item>
      <title>Build a Python library with a C extension</title>
      <link>https://pydevtools.com/handbook/tutorial/build-a-python-library-with-a-c-extension/</link>
      <pubDate>Wed, 29 Apr 2026 07:06:23 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/build-a-python-library-with-a-c-extension/</guid>
      <description>&lt;p&gt;Python handles strings well. C handles them faster. In this tutorial, you&amp;rsquo;ll write three string functions in C, compile them into a shared library, and call them from Python using &lt;a href=&#34;https://cffi.readthedocs.io/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;cffi&lt;/a&gt;. The result is a normal Python package that anyone can import.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;prerequisites&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#prerequisites&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You need two things installed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; (&lt;a href=&#34;https://docs.astral.sh/uv/getting-started/installation/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;installation guide&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A C compiler&lt;/li&gt;
&lt;/ul&gt;






&lt;div class=&#34;hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain&#34;&gt;
  &lt;div class=&#34;hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800&#34; role=&#34;tablist&#34;&gt;&lt;button class=&#34;hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white hx:hextra-focus-visible-inset&#34; id=&#34;tabs-tab-tabs-01-0&#34; role=&#34;tab&#34; type=&#34;button&#34; aria-controls=&#34;tabs-panel-tabs-01-0&#34; aria-selected=&#34;true&#34; tabindex=&#34;0&#34; data-state=&#34;selected&#34;&gt;&lt;span class=&#34;hx:inline-flex hx:items-center hx:gap-1.5&#34;&gt;&lt;span&gt;macOS/Linux&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;button class=&#34;hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white hx:hextra-focus-visible-inset&#34; id=&#34;tabs-tab-tabs-01-1&#34; role=&#34;tab&#34; type=&#34;button&#34; aria-controls=&#34;tabs-panel-tabs-01-1&#34; aria-selected=&#34;false&#34; tabindex=&#34;-1&#34;&gt;&lt;span class=&#34;hx:inline-flex hx:items-center hx:gap-1.5&#34;&gt;&lt;span&gt;Windows&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;div class=&#34;hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block&#34; id=&#34;tabs-panel-tabs-01-0&#34; role=&#34;tabpanel&#34; aria-labelledby=&#34;tabs-tab-tabs-01-0&#34; aria-hidden=&#34;false&#34; tabindex=&#34;0&#34; data-state=&#34;selected&#34;&gt;&lt;p&gt;Most macOS and Linux systems already have a C compiler. Check by running:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Build a Python library with a C&#43;&#43; extension</title>
      <link>https://pydevtools.com/handbook/tutorial/build-a-python-library-with-a-cpp-extension/</link>
      <pubDate>Fri, 08 May 2026 03:18:44 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/build-a-python-library-with-a-cpp-extension/</guid>
      <description>&lt;p&gt;Python handles most tasks well, but numerical code and tight loops can hit its performance ceiling. C++ removes that ceiling. This tutorial walks you through creating a Python package where the performance-critical code lives in C++, compiled into a native extension module that Python imports like any other module.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll use three tools together:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; manages the Python project, dependencies, and virtual environment&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://scikit-build-core.readthedocs.io/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;scikit-build-core&lt;/a&gt; is the &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-a-build-backend/&#34;&gt;build backend&lt;/a&gt; that drives CMake to compile C++ code into a Python extension module&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pybind11.readthedocs.io/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pybind11&lt;/a&gt; is the C++ library that bridges C++ and Python, letting you write C++ functions callable from Python&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Prerequisites&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;prerequisites&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#prerequisites&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; installed (&lt;a href=&#34;https://docs.astral.sh/uv/getting-started/installation/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;installation guide&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A C++ compiler (g++ or clang++)&lt;/li&gt;
&lt;li&gt;CMake 3.15 or later&lt;/li&gt;
&lt;/ul&gt;






&lt;div class=&#34;hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain&#34;&gt;
  &lt;div class=&#34;hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800&#34; role=&#34;tablist&#34;&gt;&lt;button class=&#34;hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white hx:hextra-focus-visible-inset&#34; id=&#34;tabs-tab-tabs-03-0&#34; role=&#34;tab&#34; type=&#34;button&#34; aria-controls=&#34;tabs-panel-tabs-03-0&#34; aria-selected=&#34;true&#34; tabindex=&#34;0&#34; data-state=&#34;selected&#34;&gt;&lt;span class=&#34;hx:inline-flex hx:items-center hx:gap-1.5&#34;&gt;&lt;span&gt;macOS/Linux&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;button class=&#34;hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white hx:hextra-focus-visible-inset&#34; id=&#34;tabs-tab-tabs-03-1&#34; role=&#34;tab&#34; type=&#34;button&#34; aria-controls=&#34;tabs-panel-tabs-03-1&#34; aria-selected=&#34;false&#34; tabindex=&#34;-1&#34;&gt;&lt;span class=&#34;hx:inline-flex hx:items-center hx:gap-1.5&#34;&gt;&lt;span&gt;Windows&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;div class=&#34;hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block&#34; id=&#34;tabs-panel-tabs-03-0&#34; role=&#34;tabpanel&#34; aria-labelledby=&#34;tabs-tab-tabs-03-0&#34; aria-hidden=&#34;false&#34; tabindex=&#34;0&#34; data-state=&#34;selected&#34;&gt;&lt;p&gt;Most macOS and Linux systems ship with a C++ compiler. On macOS, install the Xcode Command Line Tools (&lt;code&gt;xcode-select --install&lt;/code&gt;). On Ubuntu/Debian, install the &lt;code&gt;build-essential&lt;/code&gt; and &lt;code&gt;cmake&lt;/code&gt; packages.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Build a Python library with a Rust extension</title>
      <link>https://pydevtools.com/handbook/tutorial/build-a-python-library-with-a-rust-extension/</link>
      <pubDate>Fri, 15 May 2026 11:45:25 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/build-a-python-library-with-a-rust-extension/</guid>
      <description>&lt;p&gt;Python is flexible and productive, but sometimes a function needs to run faster than Python allows. Rust gives you that speed with memory safety and no garbage collector. This tutorial walks you through creating a Python package where the performance-critical code lives in Rust, compiled into a native extension module that Python imports like any other module.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll use three tools together:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; manages the Python project, dependencies, and virtual environment&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.maturin.rs/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;maturin&lt;/a&gt; is the &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-a-build-backend/&#34;&gt;build backend&lt;/a&gt; that compiles Rust code into a Python extension module&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pyo3.rs/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PyO3&lt;/a&gt; is the Rust library that bridges Rust and Python, letting you write Rust functions callable from Python&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Prerequisites&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;prerequisites&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#prerequisites&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; installed (&lt;a href=&#34;https://docs.astral.sh/uv/getting-started/installation/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;installation guide&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Rust installed via &lt;a href=&#34;https://rustup.rs/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;rustup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Verify both are working:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Can you trust uv long-term?</title>
      <link>https://pydevtools.com/handbook/explanation/can-you-trust-uv-long-term/</link>
      <pubDate>Tue, 28 Apr 2026 16:07:27 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/explanation/can-you-trust-uv-long-term/</guid>
      <description>&lt;p&gt;In March 2026, OpenAI &lt;a href=&#34;https://pydevtools.com/blog/openai-acquires-astral/&#34;&gt;acquired Astral&lt;/a&gt;, the venture-backed startup behind &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;. Before betting a team&amp;rsquo;s workflow on a tool whose owner&amp;rsquo;s priorities just changed, the reasonable question is what happens if Astral&amp;rsquo;s output slows or stops.&lt;/p&gt;
&lt;p&gt;The handbook recommends uv. This page lays out why that recommendation survives the trust question, what would have to change before it doesn&amp;rsquo;t, and what to do today to keep your migration costs low.&lt;/p&gt;
&lt;h2&gt;Look at what you actually adopt&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;look-at-what-you-actually-adopt&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#look-at-what-you-actually-adopt&#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 is dual-licensed under &lt;a href=&#34;https://github.com/astral-sh/uv/blob/main/README.md#license&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Apache 2.0 and MIT&lt;/a&gt;. That license cannot be revoked. Every release that has shipped is permanently available to fork, modify, or redistribute. Anyone, including you, can freeze the source tree at any commit and keep using it. No future owner can take that away.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create your first Python project with uv</title>
      <link>https://pydevtools.com/handbook/tutorial/create-your-first-python-project/</link>
      <pubDate>Fri, 15 May 2026 07:00:57 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/create-your-first-python-project/</guid>
      <description>&lt;p&gt;This Python uv tutorial walks you through building a text analysis tool that counts words, measures sentence length, and reports word frequency. No prior Python experience required; &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; handles the Python install, project scaffolding, and dependency management for you.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;prerequisites&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#prerequisites&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before we begin, make sure you have uv installed on your system. You can install it following &lt;a href=&#34;https://docs.astral.sh/uv/getting-started/installation/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;the directions from the uv documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://git-scm.com/downloads&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Git&lt;/a&gt; is optional. uv does not install Git for you, but if Git is already on your &lt;code&gt;PATH&lt;/code&gt;, &lt;code&gt;uv init&lt;/code&gt; initializes a Git repository in the new project. The tutorial works either way.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Do I need a project to use uv?</title>
      <link>https://pydevtools.com/handbook/explanation/do-i-need-a-project-to-use-uv/</link>
      <pubDate>Tue, 28 Apr 2026 21:54:51 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/explanation/do-i-need-a-project-to-use-uv/</guid>
      <description>&lt;p&gt;If your Python life is a folder full of short scripts that glue APIs together and rename files, &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;&amp;rsquo;s first move can look like overkill: &lt;code&gt;uv init&lt;/code&gt;, then a &lt;code&gt;pyproject.toml&lt;/code&gt;. uv works fine for scripts, but it assumes a different mental model from the &lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;&lt;code&gt;pip install&lt;/code&gt;&lt;/a&gt; habit most script authors carry, and forcing the old habit onto uv is where people get stuck.&lt;/p&gt;
&lt;p&gt;The short answer: no, you don&amp;rsquo;t need a project. You have four options, and the right one depends on what the script is.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Do you still need tox or nox if you use uv?</title>
      <link>https://pydevtools.com/handbook/explanation/do-you-still-need-tox-or-nox-if-you-use-uv/</link>
      <pubDate>Sat, 16 May 2026 07:30:29 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/explanation/do-you-still-need-tox-or-nox-if-you-use-uv/</guid>
      <description>&lt;p&gt;For many projects, no. &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; can run your test suite against multiple Python versions without any extra tool. But &lt;a href=&#34;https://pydevtools.com/handbook/reference/tox/&#34;&gt;tox&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/nox/&#34;&gt;nox&lt;/a&gt; do more than version switching, and the gap between &amp;ldquo;run pytest on 3.12&amp;rdquo; and &amp;ldquo;test five Python versions against two dependency sets in parallel&amp;rdquo; is where they still matter.&lt;/p&gt;
&lt;h2&gt;What uv handles on its own&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;what-uv-handles-on-its-own&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#what-uv-handles-on-its-own&#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;code&gt;uv run --python&lt;/code&gt; selects a Python version and executes a command in your project&amp;rsquo;s environment. If that version is not installed, uv downloads it automatically:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting started with uv</title>
      <link>https://pydevtools.com/handbook/tutorial/getting-started-with-uv/</link>
      <pubDate>Thu, 14 May 2026 08:14:46 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/getting-started-with-uv/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; handles Python installation, project setup, dependency management, and script execution in a single tool. This tutorial walks through each of those capabilities so you can start using uv for any Python project.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;prerequisites&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#prerequisites&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You need a terminal (Terminal on macOS, PowerShell on Windows, or any Linux shell). No prior Python installation is required.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://git-scm.com/downloads&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Git&lt;/a&gt; is optional. If Git is on your &lt;code&gt;PATH&lt;/code&gt;, &lt;code&gt;uv init&lt;/code&gt; initializes a repository in the new project. uv does not install Git itself; install it separately if you want version control. The tutorial steps work either way.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How do pyenv and uv compare for Python interpreter management?</title>
      <link>https://pydevtools.com/handbook/explanation/how-do-pyenv-and-uv-compare-for-python-interpreter-management/</link>
      <pubDate>Tue, 07 Apr 2026 14:40:41 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/explanation/how-do-pyenv-and-uv-compare-for-python-interpreter-management/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/pyenv/&#34;&gt;pyenv&lt;/a&gt; manages Python versions and gets out of the way; &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; manages Python versions as part of controlling your entire workflow. That difference in scope shapes every other trade-off between the two tools.&lt;/p&gt;
&lt;h2&gt;Design Philosophy&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;design-philosophy&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#design-philosophy&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;pyenv&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;pyenv&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#pyenv&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;pyenv embodies the Unix principle of &amp;ldquo;do one thing well.&amp;rdquo; Its sole purpose is managing Python interpreter installations and version switching. This focused approach means pyenv integrates seamlessly with existing workflows; after selecting a Python version, developers use familiar tools like &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/venv/&#34;&gt;venv&lt;/a&gt; for package management and virtual environments.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How do uv and Poetry compare?</title>
      <link>https://pydevtools.com/handbook/explanation/how-do-uv-and-poetry-compare/</link>
      <pubDate>Fri, 10 Apr 2026 13:36:01 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/explanation/how-do-uv-and-poetry-compare/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/poetry/&#34;&gt;Poetry&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; both manage Python projects through &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyproject.toml/&#34;&gt;pyproject.toml&lt;/a&gt;, create lockfiles, and handle virtual environments. Poetry has been the default recommendation for years; uv, built by Astral, arrived in 2024 with broader scope and faster dependency resolution. They differ in how.&lt;/p&gt;
&lt;h2&gt;Scope&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;scope&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#scope&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Poetry handles dependency management, virtual environments, building, and publishing. Everything else it delegates. A different Python version requires &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyenv/&#34;&gt;pyenv&lt;/a&gt;. Running a CLI tool without installing it globally requires &lt;a href=&#34;https://pydevtools.com/handbook/reference/pipx/&#34;&gt;pipx&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How Python tools adopt uv under the hood</title>
      <link>https://pydevtools.com/handbook/explanation/how-python-tools-adopt-uv-under-the-hood/</link>
      <pubDate>Tue, 28 Apr 2026 21:54:51 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/explanation/how-python-tools-adopt-uv-under-the-hood/</guid>
      <description>&lt;p&gt;You don&amp;rsquo;t have to switch to &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; to get uv&amp;rsquo;s speed. &lt;a href=&#34;https://pydevtools.com/handbook/reference/pixi/&#34;&gt;Pixi&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/hatch/&#34;&gt;Hatch&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/pdm/&#34;&gt;PDM&lt;/a&gt;, and &lt;a href=&#34;https://pydevtools.com/handbook/reference/tox/&#34;&gt;tox&lt;/a&gt; now use uv&amp;rsquo;s resolver and installer as their backend, which means your existing tool may already run on uv under the hood.&lt;/p&gt;
&lt;h2&gt;Which tools use uv&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;which-tools-use-uv&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#which-tools-use-uv&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Tool&lt;/th&gt;
          &lt;th&gt;What it delegates to uv&lt;/th&gt;
          &lt;th&gt;How to enable&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/pixi/&#34;&gt;Pixi&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;PyPI dependency resolution and installation&lt;/td&gt;
          &lt;td&gt;Automatic (default behavior)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/hatch/&#34;&gt;Hatch&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Dependency installation and venv creation&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;installer = &amp;quot;uv&amp;quot;&lt;/code&gt; in env config&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/pdm/&#34;&gt;PDM&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Dependency resolution and installation&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;pdm config use_uv true&lt;/code&gt; (experimental)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/tox/&#34;&gt;tox&lt;/a&gt; (via &lt;a href=&#34;https://pydevtools.com/handbook/reference/tox-uv/&#34;&gt;tox-uv&lt;/a&gt;)&lt;/td&gt;
          &lt;td&gt;Dependency installation and venv creation&lt;/td&gt;
          &lt;td&gt;Install the &lt;code&gt;tox-uv&lt;/code&gt; plugin&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/nox/&#34;&gt;nox&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Dependency installation&lt;/td&gt;
          &lt;td&gt;Enable &lt;a href=&#34;https://nox.thea.codes/en/stable/config.html#configuring-a-session-s-virtualenv&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;nox&amp;rsquo;s uv backend&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/prek/&#34;&gt;prek&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Python version and venv management for hooks&lt;/td&gt;
          &lt;td&gt;Automatic&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Pixi uses uv by default for all PyPI packages. Prek does the same for hook environments. The rest require opt-in configuration.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to add dynamic versioning to uv projects</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-add-dynamic-versioning-to-uv-projects/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-add-dynamic-versioning-to-uv-projects/</guid>
      <description>&lt;p&gt;Dynamic versioning generates version numbers from Git tags instead of requiring manual updates to a static version string in &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyproject.toml/&#34;&gt;pyproject.toml&lt;/a&gt;. The release workflow becomes a single &lt;code&gt;git tag&lt;/code&gt; command: the build backend reads the tag, and the wheel and source distribution filenames pick up the matching version automatically.&lt;/p&gt;
&lt;p&gt;This guide uses &lt;a href=&#34;https://github.com/ninoseki/uv-dynamic-versioning/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv-dynamic-versioning&lt;/a&gt;, a &lt;a href=&#34;https://pydevtools.com/handbook/reference/hatch/&#34;&gt;hatchling&lt;/a&gt; plugin that ships a sensible default configuration for &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; projects.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;prerequisites&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#prerequisites&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A Git repository for your Python project with at least one commit&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; installed on your system&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;src/your_package/&lt;/code&gt; layout (the default for &lt;code&gt;uv init --package&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Configure the build system&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;configure-the-build-system&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#configure-the-build-system&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Update &lt;code&gt;pyproject.toml&lt;/code&gt; to use uv-dynamic-versioning as a &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-a-build-backend/&#34;&gt;build backend&lt;/a&gt; dependency:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to add Python to your system path with uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-add-python-to-your-system-path-with-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-add-python-to-your-system-path-with-uv/</guid>
      <description>&lt;p&gt;Since uv 0.8, Python versions installed by &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; are automatically added to your PATH. When you run &lt;code&gt;uv python install&lt;/code&gt;, uv places versioned Python executables (like &lt;code&gt;python3.12&lt;/code&gt;) in a directory on your PATH (typically &lt;code&gt;~/.local/bin&lt;/code&gt;).&lt;/p&gt;
&lt;h2&gt;Installing a Python version&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;installing-a-python-version&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#installing-a-python-version&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&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 python install 3.12&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;After running the command, the versioned executable is available:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Build Read the Docs with uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-build-read-the-docs-with-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-build-read-the-docs-with-uv/</guid>
      <description>&lt;p&gt;If your docs already build on Read the Docs, you can now switch &lt;code&gt;.readthedocs.yaml&lt;/code&gt; to native &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; support instead of maintaining a hand-rolled &lt;code&gt;build.jobs&lt;/code&gt; override. Read the Docs added this support on April 21, 2026. The two supported paths are &lt;code&gt;uv sync&lt;/code&gt; with a &lt;code&gt;docs&lt;/code&gt; dependency group, and &lt;code&gt;uv pip install&lt;/code&gt; with a requirements file.&lt;/p&gt;
&lt;h2&gt;Define a docs dependency group&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;define-a-docs-dependency-group&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#define-a-docs-dependency-group&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If your project already has a &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyproject.toml/&#34;&gt;&lt;code&gt;pyproject.toml&lt;/code&gt;&lt;/a&gt;, declare a dependency group for the documentation toolchain. Groups are the &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-pep-735/&#34;&gt;PEP 735&lt;/a&gt; standard place to keep development-only dependencies out of what your users install:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to change the Python version of a uv project</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-change-the-python-version-of-a-uv-project/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-change-the-python-version-of-a-uv-project/</guid>
      <description>&lt;p&gt;To change the Python version of a &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; project, run &lt;code&gt;uv python pin 3.12&lt;/code&gt; to update &lt;code&gt;.python-version&lt;/code&gt;, then &lt;code&gt;uv sync&lt;/code&gt; to rebuild the virtual environment against the new interpreter. If you also want to change which versions the project &lt;em&gt;supports&lt;/em&gt;, edit &lt;code&gt;requires-python&lt;/code&gt; in &lt;code&gt;pyproject.toml&lt;/code&gt; and run &lt;code&gt;uv lock &amp;amp;&amp;amp; uv sync&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A uv project tracks Python versions in two places: the &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-a-python-version-file/&#34;&gt;.python-version file&lt;/a&gt; pins the development interpreter (e.g., &lt;code&gt;3.12&lt;/code&gt;), and &lt;code&gt;requires-python&lt;/code&gt; in &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyproject.toml/&#34;&gt;pyproject.toml&lt;/a&gt; declares which versions the project supports (e.g., &lt;code&gt;&amp;gt;=3.11&lt;/code&gt;). The pinned version must satisfy the &lt;code&gt;requires-python&lt;/code&gt; constraint, or uv will report an &lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-fix-python-version-incompatibility-errors-in-uv/&#34;&gt;incompatibility error&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to configure Claude Code to use uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-configure-claude-code-to-use-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-configure-claude-code-to-use-uv/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://claude.com/product/claude-code&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Claude Code&lt;/a&gt; defaults to &lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;pip&lt;/a&gt; when it needs to install packages or run scripts. A &lt;a href=&#34;https://code.claude.com/docs/en/memory#set-up-a-project-claude-md&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CLAUDE.md&lt;/a&gt; file in your project root overrides that default so every session uses &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; instead.&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>How to configure Cursor for a uv project</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-configure-cursor-for-a-uv-project/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-configure-cursor-for-a-uv-project/</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-amber-200 hx:bg-amber-100 hx:text-amber-900 hx:dark:border-amber-200/30 hx:dark:bg-amber-900/30 hx:dark:text-amber-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;M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z&#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 guide assumes you have a Python project managed with &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv&lt;/a&gt;. If you haven&amp;rsquo;t created a project yet, see the &lt;a href=&#34;https://pydevtools.com/handbook/tutorial/create-your-first-python-project/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;project creation tutorial&lt;/a&gt;.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Cursor is a fork of VS Code, so most Python tooling configuration works the same way. The key difference is Cursor&amp;rsquo;s AI agent, which needs explicit rules to use uv instead of pip. This guide covers both the editor setup and the agent configuration.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to configure Cursor rules to use uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-configure-cursor-rules-to-use-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-configure-cursor-rules-to-use-uv/</guid>
      <description>&lt;p&gt;This guide shows you how to configure &lt;a href=&#34;https://cursor.com/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Cursor&lt;/a&gt; &lt;a href=&#34;https://docs.cursor.com/context/rules&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;editor rules&lt;/a&gt; to automatically use &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; for Python package management instead of &lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;pip&lt;/a&gt;. Cursor rules help ensure consistent tooling across your development workflow by providing context to the AI about your project preferences.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;prerequisites&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#prerequisites&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://cursor.com/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Cursor editor&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.astral.sh/uv/getting-started/installation/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv installed&lt;/a&gt; on your system&lt;/li&gt;
&lt;li&gt;A uv-based Python project (e.g. created with &lt;code&gt;uv init&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Create Cursor rules to use uv&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;create-cursor-rules-to-use-uv&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#create-cursor-rules-to-use-uv&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;hextra-steps hx:ml-4 hx:mb-12 hx:ltr:border-l hx:rtl:border-r hx:border-gray-200 hx:ltr:pl-6 hx:rtl:pr-6 hx:dark:border-neutral-800 [counter-reset:step]&#34;&gt;
&lt;h3&gt;1. Create a global Cursor rules file&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;1-create-a-global-cursor-rules-file&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#1-create-a-global-cursor-rules-file&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To apply uv rules across all your Python projects, create a global Cursor rules file by opening the Cursor Command Palette (View Menu → Command Palette), search for &amp;ldquo;New Cursor Rule&amp;rdquo;, and create a new rule named &amp;ldquo;uv&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to configure VS Code for a uv project</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-configure-vs-code-for-a-uv-project/</link>
      <pubDate>Tue, 12 May 2026 07:33:09 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-configure-vs-code-for-a-uv-project/</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-amber-200 hx:bg-amber-100 hx:text-amber-900 hx:dark:border-amber-200/30 hx:dark:bg-amber-900/30 hx:dark:text-amber-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;M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z&#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 guide assumes you have a Python project managed with &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv&lt;/a&gt;. If you haven&amp;rsquo;t created a project yet, see the &lt;a href=&#34;https://pydevtools.com/handbook/tutorial/create-your-first-python-project/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;project creation tutorial&lt;/a&gt;.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;VS Code needs three things to work well with a &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; project: the right Python interpreter, a formatter and linter, and a test runner. This guide covers each.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to convert a script with requirements.txt to PEP 723 inline metadata</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-convert-a-script-with-requirements-txt-to-pep-723-inline-metadata/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-convert-a-script-with-requirements-txt-to-pep-723-inline-metadata/</guid>
      <description>&lt;p&gt;A standalone Python script paired with a &lt;code&gt;requirements.txt&lt;/code&gt; is the old way of saying &amp;ldquo;this script needs these libraries.&amp;rdquo; &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-pep-723/&#34;&gt;PEP 723&lt;/a&gt; replaces the sidecar file with a TOML block embedded in the script itself, and &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; reads that block to install dependencies into a temporary &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-a-virtual-environment/&#34;&gt;virtual environment&lt;/a&gt; on every run.&lt;/p&gt;
&lt;h2&gt;Translate the requirements.txt into inline metadata&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;translate-the-requirementstxt-into-inline-metadata&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#translate-the-requirementstxt-into-inline-metadata&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Point &lt;code&gt;uv add --script&lt;/code&gt; at the existing requirements file. uv reads it and prepends a PEP 723 block to the script:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to create a new Python project with Codex</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-create-a-new-python-project-with-codex/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-create-a-new-python-project-with-codex/</guid>
      <description>&lt;p&gt;Codex produces consistent project scaffolding when you explicitly point it at the &lt;a href=&#34;https://pydevtools.com/handbook/explanation/modern-python-project-setup-guide-for-ai-assistants/&#34;&gt;Modern Python Project Setup Guide for AI Assistants&lt;/a&gt;. Use the canonical Markdown URL (&lt;code&gt;https://pydevtools.com/handbook/explanation/modern-python-project-setup-guide-for-ai-assistants/index.md&lt;/code&gt;) inside your first prompt so Codex follows the uv-based workflow on macOS, Linux, and Windows.&lt;/p&gt;
&lt;h2&gt;Launch Codex with the guide loaded&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;launch-codex-with-the-guide-loaded&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#launch-codex-with-the-guide-loaded&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;hextra-steps hx:ml-4 hx:mb-12 hx:ltr:border-l hx:rtl:border-r hx:border-gray-200 hx:ltr:pl-6 hx:rtl:pr-6 hx:dark:border-neutral-800 [counter-reset:step]&#34;&gt;
&lt;h3&gt;1. Open a terminal in your repository root&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;1-open-a-terminal-in-your-repository-root&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#1-open-a-terminal-in-your-repository-root&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Codex works best when it starts in the directory that already contains your project files (or the Git repo where the project will live). On macOS/Linux you can &lt;code&gt;cd /path/to/repo&lt;/code&gt;; on Windows use PowerShell&amp;rsquo;s &lt;code&gt;Set-Location&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Create and Distribute a Python CLI Tool</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-create-and-distribute-a-python-cli-tool/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-create-and-distribute-a-python-cli-tool/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/pyproject.toml/&#34;&gt;pyproject.toml&lt;/a&gt; lets you attach any Python function to an executable command name via &lt;code&gt;[project.scripts]&lt;/code&gt;. When someone installs the package, their package manager creates a wrapper script that calls that function. With &lt;a href=&#34;https://pydevtools.com/handbook/reference/uvx/&#34;&gt;uvx&lt;/a&gt;, users can run the tool without even installing it first.&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>How to customize uv&#39;s virtual environment location</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-customize-uvs-virtual-environment-location/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-customize-uvs-virtual-environment-location/</guid>
      <description>&lt;p&gt;When working with uv projects, the virtual environment is automatically created in a folder called &lt;code&gt;.venv&lt;/code&gt; in your project directory.&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;your-project/
├── pyproject.toml
├── .venv/          # Virtual environment location
└── src/&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;You can override this default with a flag or a environmental variable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to deploy a uv project to AWS Lambda</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-deploy-a-uv-project-to-aws-lambda/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-deploy-a-uv-project-to-aws-lambda/</guid>
      <description>&lt;p&gt;AWS Lambda packages a Python function as either a zip archive (up to 250 MB unzipped) or a container image (up to 10 GB). Both formats need every dependency the function imports, compiled for Lambda&amp;rsquo;s Linux runtime, with no virtual environment and no &lt;code&gt;pip install&lt;/code&gt; step at runtime. &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; is fast at producing exactly that shape, and its &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-a-lock-file/&#34;&gt;lockfile&lt;/a&gt; makes the resulting deployment reproducible.&lt;/p&gt;
&lt;h2&gt;Pick a packaging format&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;pick-a-packaging-format&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#pick-a-packaging-format&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Format&lt;/th&gt;
          &lt;th&gt;Pick when&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Container image&lt;/td&gt;
          &lt;td&gt;Production services, dependencies near or above the 250 MB zip limit, native libraries that don&amp;rsquo;t ship manylinux wheels, image-based local testing.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Zip archive&lt;/td&gt;
          &lt;td&gt;Small functions, simple dependencies, fastest cold starts on Python managed runtimes.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Lambda layer + zip&lt;/td&gt;
          &lt;td&gt;Dependencies change rarely, function code changes often.&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The zip and layer paths use the same &lt;code&gt;uv export&lt;/code&gt; + &lt;code&gt;uv pip install --target&lt;/code&gt; recipe; only the zip layout differs. The container path uses Lambda&amp;rsquo;s official Python base image and &lt;code&gt;uv pip install&lt;/code&gt; at build time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to distribute internal Python CLI tools with uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-distribute-internal-python-cli-tools-with-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-distribute-internal-python-cli-tools-with-uv/</guid>
      <description>&lt;p&gt;Your team built a CLI. Now you need one install path for teammate laptops and fresh CI runners, plus a coordinated way to push updates. &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; installs the tool from a private index, a git tag, or a wheel, and &lt;code&gt;uv tool install pkg@latest&lt;/code&gt; rolls out upgrades on command.&lt;/p&gt;
&lt;p&gt;This guide picks up where &lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-create-and-distribute-a-python-cli-tool/&#34;&gt;How to create and distribute a Python CLI tool&lt;/a&gt; leaves off. That page covers publishing the package; this one covers installing it, pinning it, and keeping it current across a team.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to fix &#34;No `project` Table Found&#34; error in uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-fix-no-project-table-found-error-in-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-fix-no-project-table-found-error-in-uv/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; project commands (&lt;code&gt;uv run&lt;/code&gt;, &lt;code&gt;uv sync&lt;/code&gt;, &lt;code&gt;uv add&lt;/code&gt;) expect a &lt;code&gt;[project]&lt;/code&gt; table in &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyproject.toml/&#34;&gt;pyproject.toml&lt;/a&gt;. Without one, uv reports:&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;error: No `project` table found in: `/path/to/pyproject.toml`&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;This happens in two common situations: a repository uses &lt;code&gt;pyproject.toml&lt;/code&gt; only for tool configuration (&lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;Ruff&lt;/a&gt;, Black, &lt;a href=&#34;https://pydevtools.com/handbook/reference/mypy/&#34;&gt;mypy&lt;/a&gt;) without declaring a project, or a &lt;code&gt;pyproject.toml&lt;/code&gt; was created manually and the &lt;code&gt;[project]&lt;/code&gt; table was omitted.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Fix Common pytest Errors with uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-fix-common-pytest-errors-with-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-fix-common-pytest-errors-with-uv/</guid>
      <description>&lt;p&gt;pytest failures that have nothing to do with your actual tests are some of the most frustrating errors in Python development. This guide covers the problems people hit most often when running pytest in &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;-managed projects and how to fix them.&lt;/p&gt;
&lt;h2&gt;ModuleNotFoundError&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;modulenotfounderror&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#modulenotfounderror&#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 most common pytest error in uv projects. There are several causes.&lt;/p&gt;
&lt;h3&gt;Missing &lt;code&gt;uv sync&lt;/code&gt;&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;missing-uv-sync&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#missing-uv-sync&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you see &lt;code&gt;ModuleNotFoundError&lt;/code&gt; for your own package, the project likely has not been installed into the virtual environment:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to fix Python version incompatibility errors in uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-fix-python-version-incompatibility-errors-in-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-fix-python-version-incompatibility-errors-in-uv/</guid>
      <description>&lt;h2&gt;Understanding the Error&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;understanding-the-error&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#understanding-the-error&#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 you see an error like this:&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;error: The Python request from `.python-version` resolved to Python 3.9.1, which is incompatible with the project&amp;#39;s Python requirement: `&amp;gt;=3.10`. Use `uv python pin` to update the `.python-version` file to a compatible version.&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;This means:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to install Python CLI tools without Python</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-install-python-cli-tools-without-python/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-install-python-cli-tools-without-python/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://uvx.sh&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uvx.sh&lt;/a&gt; provides installation scripts for any Python tool on PyPI. Use it to install tools like ruff, pre-commit, or pytest without having &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; or Python already installed.&lt;/p&gt;
&lt;h2&gt;Installing a Tool&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;installing-a-tool&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#installing-a-tool&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;






&lt;div class=&#34;hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain&#34;&gt;
  &lt;div class=&#34;hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800&#34; role=&#34;tablist&#34;&gt;&lt;button class=&#34;hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white hx:hextra-focus-visible-inset&#34; id=&#34;tabs-tab-tabs-01-0&#34; role=&#34;tab&#34; type=&#34;button&#34; aria-controls=&#34;tabs-panel-tabs-01-0&#34; aria-selected=&#34;true&#34; tabindex=&#34;0&#34; data-state=&#34;selected&#34;&gt;&lt;span class=&#34;hx:inline-flex hx:items-center hx:gap-1.5&#34;&gt;&lt;span&gt;macOS/Linux&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;button class=&#34;hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white hx:hextra-focus-visible-inset&#34; id=&#34;tabs-tab-tabs-01-1&#34; role=&#34;tab&#34; type=&#34;button&#34; aria-controls=&#34;tabs-panel-tabs-01-1&#34; aria-selected=&#34;false&#34; tabindex=&#34;-1&#34;&gt;&lt;span class=&#34;hx:inline-flex hx:items-center hx:gap-1.5&#34;&gt;&lt;span&gt;Windows&lt;/span&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;div class=&#34;hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block&#34; id=&#34;tabs-panel-tabs-01-0&#34; role=&#34;tabpanel&#34; aria-labelledby=&#34;tabs-tab-tabs-01-0&#34; aria-hidden=&#34;false&#34; tabindex=&#34;0&#34; data-state=&#34;selected&#34;&gt;&lt;p&gt;Replace &lt;code&gt;{package}&lt;/code&gt; with any PyPI package name:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to install Python with uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-install-python-with-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-install-python-with-uv/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; downloads and installs Python interpreters on demand, so you usually don&amp;rsquo;t need to install Python explicitly. Run &lt;code&gt;uv python install&lt;/code&gt; ahead of time to make a version available offline or to put it on your PATH. uv pulls prebuilt CPython binaries from &lt;a href=&#34;https://github.com/astral-sh/python-build-standalone&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;python-build-standalone&lt;/a&gt;, so installs don&amp;rsquo;t need admin privileges and don&amp;rsquo;t replace &lt;a href=&#34;https://pydevtools.com/handbook/explanation/why-should-i-avoid-system-python/&#34;&gt;system Python&lt;/a&gt; or interpreters managed by &lt;a href=&#34;https://pydevtools.com/handbook/reference/homebrew/&#34;&gt;Homebrew&lt;/a&gt; or &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyenv/&#34;&gt;pyenv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The same commands work on macOS, Linux, and Windows. You only need &lt;a href=&#34;https://docs.astral.sh/uv/getting-started/installation/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv installed&lt;/a&gt; first.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Install PyTorch with uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-install-pytorch-with-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-install-pytorch-with-uv/</guid>
      <description>&lt;p&gt;PyTorch publishes different wheel builds for CPU, CUDA, ROCm, and XPU on separate package indexes (see &lt;a href=&#34;https://pydevtools.com/handbook/explanation/installing-cuda-python-packages/&#34;&gt;Why Installing GPU Python Packages Is So Complicated&lt;/a&gt; for background). Getting the right build requires telling &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; which index to use.&lt;/p&gt;
&lt;h2&gt;Default behavior without configuration&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;default-behavior-without-configuration&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#default-behavior-without-configuration&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Running &lt;code&gt;uv add torch torchvision&lt;/code&gt; with no extra configuration installs from PyPI. PyPI carries CPU-only wheels for Windows and macOS, and CUDA 12.8 wheels for Linux (as of PyTorch 2.9.1). For projects that only need CPU support on Windows/macOS and GPU support on Linux, this default works without any additional setup.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Install RAPIDS with uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-install-rapids-with-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-install-rapids-with-uv/</guid>
      <description>&lt;p&gt;RAPIDS packages live on NVIDIA&amp;rsquo;s own package index, not PyPI (see &lt;a href=&#34;https://pydevtools.com/handbook/explanation/installing-cuda-python-packages/&#34;&gt;Why Installing GPU Python Packages Is So Complicated&lt;/a&gt; for background). Getting &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; to find them requires registering that index.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;prerequisites&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#prerequisites&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;RAPIDS requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linux with glibc &amp;gt;= 2.28 (Ubuntu 20.04+, Debian 10+, Fedora 29+). On Windows, use WSL2 on Windows 11. macOS is not supported.&lt;/li&gt;
&lt;li&gt;NVIDIA GPU with compute capability 7.0+ (Volta architecture or newer).&lt;/li&gt;
&lt;li&gt;NVIDIA driver version 525.60.13+ for CUDA 12, or 580.65.06+ for CUDA 13.&lt;/li&gt;
&lt;li&gt;Python 3.10, 3.11, 3.12, or 3.13.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check the installed driver version with:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to install the Astral plugins for Claude Code</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-install-astral-plugins-for-claude-code/</link>
      <pubDate>Sat, 16 May 2026 07:30:29 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-install-astral-plugins-for-claude-code/</guid>
      <description>&lt;p&gt;Astral publishes an &lt;a href=&#34;https://github.com/astral-sh/claude-code-plugins&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;official Claude Code plugin&lt;/a&gt; that bundles three skills (&lt;code&gt;/astral:uv&lt;/code&gt;, &lt;code&gt;/astral:ruff&lt;/code&gt;, &lt;code&gt;/astral:ty&lt;/code&gt;) and a &lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt; language server. The skills give Claude up-to-date usage guidance for each tool, and the language server feeds live type-checking diagnostics into the conversation.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;prerequisites&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#prerequisites&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://claude.com/product/claude-code&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Claude Code&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-install-uv/&#34;&gt;uv installed&lt;/a&gt; (required by the ty language server)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Install the plugin for yourself&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;install-the-plugin-for-yourself&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#install-the-plugin-for-yourself&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;hextra-steps hx:ml-4 hx:mb-12 hx:ltr:border-l hx:rtl:border-r hx:border-gray-200 hx:ltr:pl-6 hx:rtl:pr-6 hx:dark:border-neutral-800 [counter-reset:step]&#34;&gt;
&lt;h3&gt;1. Add the Astral marketplace&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;1-add-the-astral-marketplace&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#1-add-the-astral-marketplace&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Run this slash command inside Claude Code:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to install uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-install-uv/</link>
      <pubDate>Mon, 11 May 2026 06:31:15 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-install-uv/</guid>
      <description>&lt;p&gt;You can install &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;, the fast Python package and project manager, with a standalone installer, with pip, or with package managers like Homebrew, WinGet, and Scoop. The recommended method on every platform is the official standalone installer, because it requires no existing Python interpreter, no package manager, and no other prerequisites.&lt;/p&gt;
&lt;p&gt;You do not need Python installed first. The standalone installer downloads a self-contained uv binary, and uv can then install and manage Python interpreters for you.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to install uv on 32-bit Raspberry Pi OS</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-install-uv-on-32-bit-raspberry-pi-os/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-install-uv-on-32-bit-raspberry-pi-os/</guid>
      <description>&lt;p&gt;uv&amp;rsquo;s standalone installer works on 32-bit Raspberry Pi OS (armv7l), but three quirks bite first-time users: &lt;code&gt;uv python install&lt;/code&gt; can fail to detect glibc on some Pi setups, PyPI rarely ships armv7l wheels, and a 32-bit userland running on a 64-bit kernel reports the wrong architecture. This guide walks through each so a 32-bit Pi install ends up in a working state.&lt;/p&gt;
&lt;p&gt;For 64-bit Pi OS, the standard path applies; see &lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-run-python-scripts-on-a-raspberry-pi-with-uv/&#34;&gt;How to run Python scripts on a Raspberry Pi with uv&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to install uv on Linux</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-install-uv-on-linux/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-install-uv-on-linux/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; is a fast Python package and project manager. This guide covers how to install it on Linux.&lt;/p&gt;
&lt;h2&gt;Standalone installer (recommended)&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;standalone-installer-recommended&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#standalone-installer-recommended&#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 standalone installer is the recommended method because it requires no prerequisites: no Python, no package manager, nothing. It downloads a prebuilt binary and adds it to your &lt;code&gt;PATH&lt;/code&gt;.&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;curl -LsSf https://astral.sh/uv/install.sh &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sh&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;If your system doesn&amp;rsquo;t have &lt;code&gt;curl&lt;/code&gt;, use &lt;code&gt;wget&lt;/code&gt; instead:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to install uv on macOS</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-install-uv-on-macos/</link>
      <pubDate>Thu, 14 May 2026 14:35:17 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-install-uv-on-macos/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; is a fast Python package and project manager. This guide covers how to install it on macOS.&lt;/p&gt;
&lt;h2&gt;Standalone installer (recommended)&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;standalone-installer-recommended&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#standalone-installer-recommended&#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 standalone installer is the recommended method because it requires no prerequisites: no Python, no package manager, nothing. It downloads a prebuilt binary and adds it to your &lt;code&gt;PATH&lt;/code&gt;.&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;curl -LsSf https://astral.sh/uv/install.sh &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sh&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;After running the installer, open a new terminal window so the updated &lt;code&gt;PATH&lt;/code&gt; takes effect.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to install uv on Windows</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-install-uv-on-windows/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-install-uv-on-windows/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; is a fast Python package and project manager. This guide covers how to install it on Windows.&lt;/p&gt;
&lt;h2&gt;Standalone installer (recommended)&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;standalone-installer-recommended&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#standalone-installer-recommended&#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 standalone installer is the recommended method because it requires no prerequisites: no Python, no package manager, nothing. It downloads a prebuilt binary and adds it to your &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Open PowerShell and run:&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-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;powershell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-ExecutionPolicy&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ByPass&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;irm https://astral.sh/uv/install.ps1 | iex&amp;#34;&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;The &lt;code&gt;-ExecutionPolicy ByPass&lt;/code&gt; flag allows running the installation script from the internet.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to keep Python up to date with uv python upgrade</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-keep-python-up-to-date-with-uv-python-upgrade/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-keep-python-up-to-date-with-uv-python-upgrade/</guid>
      <description>&lt;p&gt;Run &lt;code&gt;uv python upgrade&lt;/code&gt; to pull the latest patch release for every Python that &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; manages. Pass a minor version (&lt;code&gt;uv python upgrade 3.12&lt;/code&gt;) to scope the upgrade to one line. &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-a-virtual-environment/&#34;&gt;Virtual environments&lt;/a&gt; created from a minor-version pin follow the new patch automatically.&lt;/p&gt;
&lt;p&gt;This keeps uv-managed CPython installs current with security and bug-fix releases. It does not touch &lt;a href=&#34;https://pydevtools.com/handbook/explanation/why-should-i-avoid-system-python/&#34;&gt;system Python&lt;/a&gt; or interpreters installed by &lt;a href=&#34;https://pydevtools.com/handbook/reference/homebrew/&#34;&gt;Homebrew&lt;/a&gt; or &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyenv/&#34;&gt;pyenv&lt;/a&gt;. For installing a new minor version or switching a project, see &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; and &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;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to manage cross-repository Python dependencies with uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-manage-cross-repo-python-dependencies-with-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-manage-cross-repo-python-dependencies-with-uv/</guid>
      <description>&lt;p&gt;A &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; workspace keeps sibling packages in sync when they live in the same repository. When the packages live in &lt;em&gt;separate&lt;/em&gt; repositories, reach for &lt;code&gt;[tool.uv.sources]&lt;/code&gt; instead. A source override lets each consumer point a dependency at a local checkout, a git ref, or the published version on PyPI without changing the dependency spec itself.&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;</description>
    </item>
    <item>
      <title>How to migrate from Pipenv to uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-migrate-from-pipenv-to-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-migrate-from-pipenv-to-uv/</guid>
      <description>&lt;p&gt;Pipenv combines &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/virtualenv/&#34;&gt;virtualenv&lt;/a&gt; into a single tool. &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; covers the same ground and adds Python version management, a standards-compliant &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyproject.toml/&#34;&gt;pyproject.toml&lt;/a&gt;-based workflow, and significantly faster dependency resolution.&lt;/p&gt;
&lt;p&gt;Migrating replaces the &lt;a href=&#34;https://pydevtools.com/handbook/reference/pipfile/&#34;&gt;Pipfile&lt;/a&gt; and &lt;code&gt;Pipfile.lock&lt;/code&gt; with &lt;code&gt;pyproject.toml&lt;/code&gt; and &lt;code&gt;uv.lock&lt;/code&gt;, and swaps &lt;code&gt;pipenv&lt;/code&gt; commands for their &lt;code&gt;uv&lt;/code&gt; equivalents.&lt;/p&gt;
&lt;h2&gt;Automated migration&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;automated-migration&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#automated-migration&#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;a href=&#34;https://osprey-oss.github.io/migrate-to-uv/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;migrate-to-uv&lt;/a&gt; tool automates the conversion.&lt;/p&gt;
&lt;div class=&#34;hextra-steps hx:ml-4 hx:mb-12 hx:ltr:border-l hx:rtl:border-r hx:border-gray-200 hx:ltr:pl-6 hx:rtl:pr-6 hx:dark:border-neutral-800 [counter-reset:step]&#34;&gt;
&lt;h3&gt;1. Run the migration tool&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;1-run-the-migration-tool&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#1-run-the-migration-tool&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&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;gp&#34;&gt;$&lt;/span&gt; uvx migrate-to-uv
&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 reads your &lt;code&gt;Pipfile&lt;/code&gt; and:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to migrate from Poetry to uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-migrate-from-poetry-to-uv/</link>
      <pubDate>Thu, 14 May 2026 14:35:17 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-migrate-from-poetry-to-uv/</guid>
      <description>&lt;p&gt;This guide walks through the process of migrating a &lt;a href=&#34;https://pydevtools.com/handbook/reference/poetry/&#34;&gt;Poetry&lt;/a&gt;-managed Python project to &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; using the &lt;a href=&#34;https://osprey-oss.github.io/migrate-to-uv/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;migrate-to-uv&lt;/a&gt; tool.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;prerequisites&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#prerequisites&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.astral.sh/uv/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;A &lt;a href=&#34;https://pydevtools.com/handbook/reference/poetry/&#34;&gt;Poetry&lt;/a&gt;-managed Python project&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Basic Migration&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;basic-migration&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#basic-migration&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;hextra-steps hx:ml-4 hx:mb-12 hx:ltr:border-l hx:rtl:border-r hx:border-gray-200 hx:ltr:pl-6 hx:rtl:pr-6 hx:dark:border-neutral-800 [counter-reset:step]&#34;&gt;
&lt;h3&gt;1. Navigate to your Poetry project directory&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;1-navigate-to-your-poetry-project-directory&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#1-navigate-to-your-poetry-project-directory&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&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;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; your-poetry-project&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;h3&gt;2. Run the migration tool&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;2-run-the-migration-tool&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#2-run-the-migration-tool&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&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 migrate-to-uv&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 will:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to migrate from requirements.txt to pyproject.toml with uv</title>
      <link>https://pydevtools.com/handbook/how-to/migrate-requirements.txt/</link>
      <pubDate>Mon, 04 May 2026 08:09:53 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/migrate-requirements.txt/</guid>
      <description>&lt;p&gt;To migrate a &lt;a href=&#34;https://pydevtools.com/handbook/reference/requirements/&#34;&gt;requirements.txt&lt;/a&gt; project to &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyproject.toml/&#34;&gt;pyproject.toml&lt;/a&gt;, run &lt;code&gt;uv init --bare&lt;/code&gt; to create a minimal pyproject.toml, then &lt;code&gt;uv add -r requirements.txt&lt;/code&gt; to import every dependency. &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; reads the file, writes the packages into &lt;code&gt;[project.dependencies]&lt;/code&gt;, and generates a &lt;code&gt;uv.lock&lt;/code&gt; file that pins exact resolved versions.&lt;/p&gt;
&lt;p&gt;For a detailed explanation of why pyproject.toml replaces requirements.txt, see &lt;a href=&#34;https://pydevtools.com/handbook/explanation/pyproject-vs-requirements/&#34;&gt;why choose pyproject.toml over requirements.txt&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;prerequisites&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#prerequisites&#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://pydevtools.com/handbook/how-to/how-to-install-uv/&#34;&gt;Install uv&lt;/a&gt; if it isn&amp;rsquo;t already on your system.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to migrate from uv to pip</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-migrate-from-uv-to-pip/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-migrate-from-uv-to-pip/</guid>
      <description>&lt;p&gt;Moving a uv-managed project to &lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;pip&lt;/a&gt; is mostly an audit of &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyproject.toml/&#34;&gt;pyproject.toml&lt;/a&gt;, not a rebuild of the project. &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; consolidates Python interpreter installs, virtual environments, resolution, package installation, and lockfile generation into one tool, but if a project&amp;rsquo;s metadata sticks to packaging standards, most of the substitutes are short. This how-to walks through the audit and the runtime equivalents: &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyenv/&#34;&gt;pyenv&lt;/a&gt; on macOS and Linux, the official python.org installer on Windows.&lt;/p&gt;
&lt;h2&gt;Audit your pyproject.toml for uv-specific tables&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;audit-your-pyprojecttoml-for-uv-specific-tables&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#audit-your-pyprojecttoml-for-uv-specific-tables&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before exporting a lockfile, scan your &lt;code&gt;pyproject.toml&lt;/code&gt; for settings under &lt;code&gt;[tool.uv]&lt;/code&gt; and tables under &lt;code&gt;[tool.uv.*]&lt;/code&gt;. Anything outside that namespace is already standardized and pip can read it. The settings that matter:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Protect Against Python Supply Chain Attacks with uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-protect-against-python-supply-chain-attacks-with-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-protect-against-python-supply-chain-attacks-with-uv/</guid>
      <description>&lt;p&gt;Malicious packages uploaded to PyPI are usually caught and yanked within hours or days. A dependency cooldown tells &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; to ignore packages published within a recent window, so compromised versions get removed before they ever reach your environment.&lt;/p&gt;
&lt;h2&gt;Set a dependency cooldown&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;set-a-dependency-cooldown&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#set-a-dependency-cooldown&#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;exclude-newer&lt;/code&gt; setting accepts durations and timestamps. For security hardening, durations are the right choice because they create a rolling window that moves forward with the current date.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Publish to TestPyPI with uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-publish-to-testpypi-with-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-publish-to-testpypi-with-uv/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-pypi/&#34;&gt;PyPI&lt;/a&gt; versions are write-once. Upload &lt;code&gt;0.1.0&lt;/code&gt; with a broken README or a missing dependency, and the only fix is a new version number. &lt;a href=&#34;https://test.pypi.org&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;TestPyPI&lt;/a&gt; is a parallel index wired to the same tooling where the cost of a bad upload is zero. Upload there first and promote to PyPI only after the rehearsal works end to end.&lt;/p&gt;
&lt;p&gt;This guide uses &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; for the build, upload, and verification steps. The workflow slots into the &lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-publish-to-pypi-with-trusted-publishing/&#34;&gt;trusted-publishing setup&lt;/a&gt; for CI or runs entirely from a local shell with an API token.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to replace tox with uv and a Makefile</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-replace-tox-with-uv-and-a-makefile/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-replace-tox-with-uv-and-a-makefile/</guid>
      <description>&lt;p&gt;A Makefile is already the control surface for many Python projects. &lt;code&gt;make test&lt;/code&gt;, &lt;code&gt;make lint&lt;/code&gt;, &lt;code&gt;make format&lt;/code&gt; are muscle memory. Adopting &lt;a href=&#34;https://pydevtools.com/handbook/reference/tox/&#34;&gt;tox&lt;/a&gt; on top means learning a second config format with its own INI DSL, its own matrix syntax, and its own per-environment caching story, just to loop pytest across Python versions.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; makes that loop possible inside Make itself. Four pattern rules cover what most teams use tox for. The one piece that turns &amp;ldquo;works but slow&amp;rdquo; into a genuine tox replacement is uv&amp;rsquo;s &lt;code&gt;UV_PROJECT_ENVIRONMENT&lt;/code&gt; variable, which lets each Python version keep its own virtual environment side by side instead of rebuilding &lt;code&gt;.venv&lt;/code&gt; on every switch. This guide builds the Makefile from scratch, then shows where it stops being the right tool and &lt;a href=&#34;https://pydevtools.com/handbook/reference/tox-uv/&#34;&gt;tox-uv&lt;/a&gt; or &lt;a href=&#34;https://pydevtools.com/handbook/reference/nox/&#34;&gt;nox&lt;/a&gt; takes over.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Run a Jupyter Notebook with uv</title>
      <link>https://pydevtools.com/handbook/how-to/jupyter-notebook-with-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/jupyter-notebook-with-uv/</guid>
      <description>&lt;p&gt;When working with Jupyter notebooks, you should run them in isolated &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-a-virtual-environment/&#34;&gt;environments&lt;/a&gt; to prevent dependency conflicts. &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; provides several streamlined ways to do this.&lt;/p&gt;
&lt;h2&gt;Using Jupyter with uv&amp;rsquo;s Isolated Environments&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;using-jupyter-with-uvs-isolated-environments&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#using-jupyter-with-uvs-isolated-environments&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To launch a Jupyter notebook with specific dependencies using uv:&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 --with jupyter --with pandas --with matplotlib 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;This single command:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Run a Python REPL with uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-run-a-python-repl-with-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-run-a-python-repl-with-uv/</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;uv does not currently officially support a system-level installation of Python, however,
you can try it in &lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-add-python-to-your-system-path-with-uv/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;preview mode&lt;/a&gt;.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;To start an interactive Python REPL (Read-Eval-Print Loop) session using uv:&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
