<?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 – Python Development Tooling Tutorials</title>
    <link>https://pydevtools.com/handbook/tutorial/</link>
    <description>Step-by-step lessons that guide beginners through Python development tool setup and usage.</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Mon, 27 Apr 2026 11:32:36 -0400</lastBuildDate>
    
	  <atom:link href="https://pydevtools.com/handbook/tutorial/index.xml" rel="self" type="application/rss+xml" />
    
    <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>Sun, 12 Apr 2026 07:17:52 -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>Create your first Python project with pixi</title>
      <link>https://pydevtools.com/handbook/tutorial/create-your-first-python-project-with-pixi/</link>
      <pubDate>Fri, 10 Apr 2026 12:46:15 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/create-your-first-python-project-with-pixi/</guid>
      <description>&lt;p&gt;This tutorial builds a weather data analysis tool that reads CSV data, computes statistics with pandas, and produces a chart with matplotlib. Every dependency comes from &lt;a href=&#34;https://pydevtools.com/handbook/reference/conda-forge/&#34;&gt;conda-forge&lt;/a&gt; and is managed by &lt;a href=&#34;https://pydevtools.com/handbook/reference/pixi/&#34;&gt;pixi&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;Install pixi following the &lt;a href=&#34;https://pixi.sh/latest/getting_started/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;official installation instructions&lt;/a&gt;. No separate Python install is required.&lt;/p&gt;
&lt;h2&gt;Create the project&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;create-the-project&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#create-the-project&#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;pixi init weather_analysis
&lt;/span&gt;&lt;/span&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; weather_analysis&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 creates a directory with a &lt;code&gt;pixi.toml&lt;/code&gt; file that stores project metadata, dependencies, and task definitions:&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>Mon, 04 May 2026 10:58:58 -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;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>Getting started with uv</title>
      <link>https://pydevtools.com/handbook/tutorial/getting-started-with-uv/</link>
      <pubDate>Mon, 04 May 2026 08:09:53 -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;h2&gt;Installing uv&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;installing-uv&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#installing-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-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;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;Alternatively, install with Homebrew:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Migrate a conda project to pixi</title>
      <link>https://pydevtools.com/handbook/tutorial/migrate-a-conda-project-to-pixi/</link>
      <pubDate>Wed, 29 Apr 2026 13:11:49 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/migrate-a-conda-project-to-pixi/</guid>
      <description>&lt;p&gt;This tutorial converts a conda project (defined by an &lt;code&gt;environment.yml&lt;/code&gt;) into a &lt;a href=&#34;https://pydevtools.com/handbook/reference/pixi/&#34;&gt;pixi&lt;/a&gt; project. The result: project-local environments, an automatic lockfile, a built-in task runner, and access to the same &lt;a href=&#34;https://pydevtools.com/handbook/reference/conda-forge/&#34;&gt;conda-forge&lt;/a&gt; packages.&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;pixi installed (&lt;a href=&#34;https://pixi.sh/latest/getting_started/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;installation instructions&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;An &lt;code&gt;environment.yml&lt;/code&gt; file from an existing conda project&lt;/li&gt;
&lt;li&gt;Familiarity with conda workflows (see &lt;a href=&#34;https://pydevtools.com/handbook/tutorial/take-over-an-existing-conda-environment/&#34;&gt;Take Over an Existing Conda Environment&lt;/a&gt; if you&amp;rsquo;re new to conda)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why migrate&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;why-migrate&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#why-migrate&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Conda works, but pixi solves several friction points:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Publishing Your First Python Package to PyPI</title>
      <link>https://pydevtools.com/handbook/tutorial/publishing-your-first-python-package-to-pypi/</link>
      <pubDate>Tue, 28 Apr 2026 08:41:30 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/publishing-your-first-python-package-to-pypi/</guid>
      <description>&lt;p&gt;This tutorial guides you through publishing a Python package to the Python Package Index (&lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-pypi/&#34;&gt;PyPI&lt;/a&gt;) using &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;. You&amp;rsquo;ll learn the essential steps of building and uploading a package that others can install with &lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;pip&lt;/a&gt; or &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Since this is your first package, we&amp;rsquo;ll start by uploading to &lt;a href=&#34;https://test.pypi.org&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;TestPyPI&lt;/a&gt;, a &amp;ldquo;separate instance of the Python Package Index that allows you to try distribution tools and processes without affecting the real index.&amp;rdquo;&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://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 TestPyPI account (&lt;a href=&#34;https://test.pypi.org/account/register/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;register here&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A Python project ready for distribution&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Setting Up Your Project&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;setting-up-your-project&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#setting-up-your-project&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Create a new project with a name that is not currently taken on &lt;a href=&#34;https://test.pypi.org&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Test PyPI&lt;/a&gt;. You might try something like your name followed by a random number, e.g. timhopper2456543. Browse the project&amp;rsquo;s URL at &lt;code&gt;https://test.pypi.org/project/&amp;lt;PACKAGE_NAME&amp;gt;/&lt;/code&gt; first; if it returns a project page rather than a 404, the name is taken and &lt;code&gt;uv publish&lt;/code&gt; will fail later.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Run your first Python script with uv</title>
      <link>https://pydevtools.com/handbook/tutorial/how-to-run-your-first-python-script/</link>
      <pubDate>Thu, 07 May 2026 07:15:18 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/how-to-run-your-first-python-script/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; can run &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-python/&#34;&gt;Python&lt;/a&gt; scripts without any prior Python installation. This tutorial starts with a one-line script and builds up to using a third-party package through &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-pep-723/&#34;&gt;inline script metadata&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; on your system.&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>Set up a data science project with uv</title>
      <link>https://pydevtools.com/handbook/tutorial/set-up-a-data-science-project-with-uv/</link>
      <pubDate>Tue, 05 May 2026 06:58:20 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/set-up-a-data-science-project-with-uv/</guid>
      <description>&lt;p&gt;This tutorial sets up a data analysis project with &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; so that every dependency is pinned, notebooks run in the right environment, and a collaborator can reproduce your setup with a single command.&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;Install uv following the &lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-install-uv/&#34;&gt;installation guide&lt;/a&gt;. No separate Python install is required.&lt;/p&gt;
&lt;h2&gt;Create the project&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;create-the-project&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#create-the-project&#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-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; uv init weather_analysis
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Initialized project `weather-analysis` at `/path/to/weather_analysis`
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;&lt;/span&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; weather_analysis
&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 creates a project directory with a &lt;code&gt;pyproject.toml&lt;/code&gt;, a &lt;code&gt;main.py&lt;/code&gt;, and a &lt;code&gt;README.md&lt;/code&gt;. The &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyproject.toml/&#34;&gt;pyproject.toml&lt;/a&gt; stores all project metadata and dependencies:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Set up a Django project with uv</title>
      <link>https://pydevtools.com/handbook/tutorial/set-up-a-django-project-with-uv/</link>
      <pubDate>Tue, 05 May 2026 06:57:20 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/set-up-a-django-project-with-uv/</guid>
      <description>&lt;p&gt;Most &lt;a href=&#34;https://www.djangoproject.com/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Django&lt;/a&gt; setup guides still tell you to install Python and a virtual environment by hand before you reach &lt;code&gt;runserver&lt;/code&gt;. This tutorial uses &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; for the Python install and the &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-a-virtual-environment/&#34;&gt;virtual environment&lt;/a&gt;. Every &lt;code&gt;manage.py&lt;/code&gt; command runs against a pinned interpreter.&lt;/p&gt;
&lt;h2&gt;Confirm uv is installed&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;confirm-uv-is-installed&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#confirm-uv-is-installed&#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 you do not already have uv, follow the &lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-install-uv/&#34;&gt;installation guide&lt;/a&gt;. No separate Python install is required; uv will download an interpreter on first use.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Set up a GPU data science project with pixi</title>
      <link>https://pydevtools.com/handbook/tutorial/set-up-a-gpu-data-science-project-with-pixi/</link>
      <pubDate>Fri, 10 Apr 2026 12:46:15 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/set-up-a-gpu-data-science-project-with-pixi/</guid>
      <description>&lt;p&gt;This tutorial builds a PyTorch image classification project managed by &lt;a href=&#34;https://pydevtools.com/handbook/reference/pixi/&#34;&gt;pixi&lt;/a&gt;. It loads a pretrained ResNet model, classifies a sample image, and prints the top-5 predictions. The project uses pixi&amp;rsquo;s multi-environment feature to support both GPU (CUDA) and CPU-only machines from a single &lt;code&gt;pixi.toml&lt;/code&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;ul&gt;
&lt;li&gt;pixi installed (&lt;a href=&#34;https://pixi.sh/latest/getting_started/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;installation instructions&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Familiarity with pixi basics (see &lt;a href=&#34;https://pydevtools.com/handbook/tutorial/create-your-first-python-project-with-pixi/&#34;&gt;Create Your First Python Project with pixi&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;For GPU: an NVIDIA GPU with a recent driver. For CPU-only: everything works, just slower.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why conda-forge for PyTorch&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;why-conda-forge-for-pytorch&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#why-conda-forge-for-pytorch&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PyTorch on &lt;a href=&#34;https://pydevtools.com/handbook/reference/conda-forge/&#34;&gt;conda-forge&lt;/a&gt; shares the CUDA runtime with other packages. When you install PyTorch and cuDNN from conda-forge, they use the same &lt;code&gt;cuda-toolkit&lt;/code&gt; package rather than each bundling its own copy. This produces smaller environments and avoids version conflicts between CUDA-dependent libraries.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Set up Ruff for formatting and checking your code</title>
      <link>https://pydevtools.com/handbook/tutorial/set-up-ruff-for-formatting-and-checking-your-code/</link>
      <pubDate>Sat, 02 May 2026 08:50:33 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/set-up-ruff-for-formatting-and-checking-your-code/</guid>
      <description>&lt;p&gt;This tutorial helps you set up Ruff to automatically format your Python code and check it for common errors and style issues.&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 starting, make sure you have uv installed on your system. You can install it following the &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;/p&gt;
&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;You do not need Python installed - uv will handle installing it automatically.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2&gt;Creating a sample project&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;creating-a-sample-project&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#creating-a-sample-project&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s create a new project to demonstrate Ruff:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setting up GitHub Actions with uv</title>
      <link>https://pydevtools.com/handbook/tutorial/setting-up-github-actions-with-uv/</link>
      <pubDate>Wed, 06 May 2026 06:25:49 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/setting-up-github-actions-with-uv/</guid>
      <description>&lt;p&gt;Every push to &lt;code&gt;main&lt;/code&gt; and every pull request should be tested and linted automatically. This tutorial sets up that pipeline using GitHub Actions and &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;, running &lt;a href=&#34;https://pydevtools.com/handbook/reference/pytest/&#34;&gt;pytest&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;Ruff&lt;/a&gt; across multiple Python versions.&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://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 GitHub account&lt;/li&gt;
&lt;li&gt;Familiarity with &lt;a href=&#34;https://pydevtools.com/handbook/tutorial/setting-up-testing-with-pytest-and-uv/&#34;&gt;setting up testing with pytest and uv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Clone the Example Project&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;clone-the-example-project&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#clone-the-example-project&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This tutorial uses a small temperature-converter project with code and tests already written but no CI configured. Clone it and move into the directory:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setting up testing with pytest and uv</title>
      <link>https://pydevtools.com/handbook/tutorial/setting-up-testing-with-pytest-and-uv/</link>
      <pubDate>Tue, 28 Apr 2026 16:07:14 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/setting-up-testing-with-pytest-and-uv/</guid>
      <description>&lt;p&gt;Every Python project needs tests, but setting up a test suite from scratch involves decisions about project layout, dependency management, and configuration. This tutorial walks through the full setup using &lt;a href=&#34;https://pydevtools.com/handbook/reference/pytest/&#34;&gt;pytest&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;: creating a project, writing tests, using fixtures, measuring coverage, and configuring defaults.&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://docs.astral.sh/uv/getting-started/installation/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Install uv on your system.&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Creating a Project with Tests&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;creating-a-project-with-tests&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#creating-a-project-with-tests&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Start by creating a sample project with a test directory structure:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Take over an existing conda environment</title>
      <link>https://pydevtools.com/handbook/tutorial/take-over-an-existing-conda-environment/</link>
      <pubDate>Mon, 04 May 2026 08:00:31 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/take-over-an-existing-conda-environment/</guid>
      <description>&lt;p&gt;You just joined a team or lab that uses &lt;a href=&#34;https://pydevtools.com/handbook/reference/conda/&#34;&gt;conda&lt;/a&gt;. Someone handed you an &lt;code&gt;environment.yml&lt;/code&gt; and told you to &lt;code&gt;conda activate&lt;/code&gt;. This tutorial walks through the day-to-day operations: creating an environment from a file, exploring what&amp;rsquo;s installed, adding packages, handling the conda+pip boundary, and exporting a reproducible environment for teammates.&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;Install Miniforge following the &lt;a href=&#34;https://github.com/conda-forge/miniforge#install&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Miniforge installation instructions&lt;/a&gt;.&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-purple-200 hx:bg-purple-100 hx:text-purple-900 hx:dark:border-purple-200/30 hx:dark:bg-purple-900/30 hx:dark:text-purple-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;Important&lt;/p&gt;</description>
    </item>
    <item>
      <title>Try Free-Threaded Python with uv</title>
      <link>https://pydevtools.com/handbook/tutorial/try-free-threaded-python-with-uv/</link>
      <pubDate>Fri, 17 Apr 2026 09:32:42 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/tutorial/try-free-threaded-python-with-uv/</guid>
      <description>&lt;p&gt;Python threads usually don&amp;rsquo;t make CPU-bound code faster. The &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-the-gil/&#34;&gt;Global Interpreter Lock&lt;/a&gt; lets only one thread execute Python bytecode at a time, so four threads crunching through CPU work run no faster than one. Python 3.14 is the first release where the free-threaded build, proposed in &lt;a href=&#34;https://peps.python.org/pep-0703/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PEP 703: Making the Global Interpreter Lock Optional in CPython&lt;/a&gt;, ships as officially supported under &lt;a href=&#34;https://peps.python.org/pep-0779/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PEP 779: Criteria for supported status for free-threaded Python&lt;/a&gt;. This tutorial walks you through installing both the standard and free-threaded builds with &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;, running the same threaded benchmark on each, and measuring the speedup.&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
