<?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 – Packaging</title>
    <link>https://pydevtools.com/tags/packaging/</link>
    <description>The Python Developer Tooling Handbook is a comprehensive guide to Python development tools including uv, ruff, pytest, mypy, ty, and more.</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Mon, 18 May 2026 12:00:00 +0000</lastBuildDate>
    
	  <atom:link href="https://pydevtools.com/tags/packaging/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Bernát Gábor&#39;s Recap of the 2026 Python Packaging Summit</title>
      <link>https://pydevtools.com/blog/python-packaging-summit-2026-recap/</link>
      <pubDate>Mon, 18 May 2026 12:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/python-packaging-summit-2026-recap/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://us.pycon.org/2026/events/packaging-summit/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;2026 Python Packaging Summit&lt;/a&gt; ran on Friday, May 15 in Long Beach. Bernát Gábor&amp;rsquo;s &lt;a href=&#34;https://bernat.tech/posts/pycon-us-2026-packaging-summit-recap/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;hour-by-hour recap&lt;/a&gt; is the long read; the pre-summit &lt;a href=&#34;https://pydevtools.com/blog/python-packaging-summit-2026/&#34;&gt;preview&lt;/a&gt; is the companion. Worth reading the whole thing if you ship or install Python packages.&lt;/p&gt;
&lt;p&gt;The handbook-relevant headlines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/wheel/&#34;&gt;Wheel 2.0&lt;/a&gt; was restructured into a small core PEP plus optional sub-PEPs, with &lt;a href=&#34;https://peps.python.org/pep-0784/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Zstandard compression&lt;/a&gt; as the first sub-PEP. Roughly 25% smaller wheels on the top 1,000 PyPI projects. Broad adoption is years out.&lt;/li&gt;
&lt;li&gt;Mike Fiedler laid out PyPI&amp;rsquo;s safety math: project creation up 3.1x and upload bytes up 3.5x since 2024, against one funded full-time safety engineer. &lt;a href=&#34;https://pydevtools.com/handbook/explanation/why-use-trusted-publishing-for-pypi/&#34;&gt;Trusted publishing&lt;/a&gt; adoption climbed from ~10% to ~30%.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-pep-772/&#34;&gt;PEP 772&lt;/a&gt; (Packaging Council) was accepted. First elections this fall, aligned with the PSF board cycle, with PSF voting membership required to nominate or be nominated.&lt;/li&gt;
&lt;li&gt;PEP 803 defines &lt;code&gt;abi3t&lt;/code&gt;, a stable ABI for &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-pep-703/&#34;&gt;free-threaded CPython&lt;/a&gt;. A single wheel can target both interpreters via a compound &lt;code&gt;cp315-abi3.abi3t&lt;/code&gt; tag.&lt;/li&gt;
&lt;li&gt;Mobile wheels work end to end (&lt;a href=&#34;https://pydevtools.com/handbook/reference/cibuildwheel/&#34;&gt;cibuildwheel&lt;/a&gt; supports Android and iOS) but adoption is small: 11 of the top 360 packages ship Android wheels, 9 ship iOS.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class=&#34;pdt-learn-more&#34;&gt;Learn more&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;learn-more&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#learn-more&#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://bernat.tech/posts/pycon-us-2026-packaging-summit-recap/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Bernát Gábor&amp;rsquo;s full recap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://hackmd.io/@jezdez/pycon2026-packaging-summit/edit&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;HackMD collaborative summit notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/blog/python-packaging-summit-2026/&#34;&gt;The 2026 Packaging Summit Returns to PyCon US&lt;/a&gt; (pre-summit preview)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://peps.python.org/pep-0777/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PEP 777, Wheel 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://peps.python.org/pep-0803/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PEP 803, abi3t&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Locking dependencies for PEP 723 single-file scripts in May 2026</title>
      <link>https://pydevtools.com/blog/locking-dependencies-for-pep-723-scripts/</link>
      <pubDate>Fri, 08 May 2026 09:00:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/locking-dependencies-for-pep-723-scripts/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-pep-723/&#34;&gt;PEP 723&lt;/a&gt; plus &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; made single-file Python scripts easy to share. Declare dependencies in a commented TOML block, drop the file in a gist, and &lt;code&gt;uv run script.py&lt;/code&gt; builds an ephemeral environment and runs it without a project directory or activation step. Locking those dependencies so the script behaves the same six months from now is still awkward. The inline &lt;code&gt;dependencies&lt;/code&gt; list pins the top-level requirements you specify and nothing else; the transitive graph gets re-resolved every time the script runs on a new machine.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Lightning Got Owned: When `import lightning` Steals Your Credentials</title>
      <link>https://pydevtools.com/blog/lightning-pypi-compromise-import-time-supply-chain-attack/</link>
      <pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/lightning-pypi-compromise-import-time-supply-chain-attack/</guid>
      <description>&lt;p&gt;&lt;code&gt;import lightning&lt;/code&gt; shows up at the top of millions of PyTorch training scripts. On April 30, 2026, that line was enough to ship a developer&amp;rsquo;s credentials to an attacker.&lt;/p&gt;
&lt;p&gt;Two malicious versions of the &lt;a href=&#34;https://pypi.org/project/lightning/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;lightning&lt;/a&gt; PyPI package, &lt;code&gt;2.6.2&lt;/code&gt; and &lt;code&gt;2.6.3&lt;/code&gt;, were uploaded today. Lightning averages 311 thousand downloads a day, and any CI that ran &lt;code&gt;uv sync --upgrade&lt;/code&gt; between the upload and the takedown pulled the bad wheel. Neither version corresponds to a GitHub release on &lt;code&gt;Lightning-AI/pytorch-lightning&lt;/code&gt;; the latest tagged release there is still &lt;code&gt;2.6.1&lt;/code&gt; from January 30. The bad code was uploaded directly to PyPI, which is the same pattern as the &lt;a href=&#34;https://pydevtools.com/blog/litellm-supply-chain-attack-and-securing-python-dependencies/&#34;&gt;litellm compromise&lt;/a&gt; six weeks ago. &lt;a href=&#34;https://socket.dev/blog/lightning-pypi-package-compromised&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Socket&lt;/a&gt; flagged both releases 18 minutes after upload, and PyPI has since quarantined the entire project.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Did pip 26 close the gap with uv?</title>
      <link>https://pydevtools.com/blog/did-pip-26-close-the-gap-with-uv/</link>
      <pubDate>Fri, 24 Apr 2026 09:00:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/did-pip-26-close-the-gap-with-uv/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;pip&lt;/a&gt; 26.0 closed two of &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;&amp;rsquo;s clearest feature gaps in January: &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-pep-723/&#34;&gt;PEP 723&lt;/a&gt; script installs and a datetime-based package filter that mirrors uv&amp;rsquo;s &lt;code&gt;--exclude-newer&lt;/code&gt;. The &lt;a href=&#34;https://news.ycombinator.com/item?id=45751400&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;October 2025 Hacker News thread&lt;/a&gt; that kept circling back to &amp;ldquo;pip has quietly caught up&amp;rdquo; now reads less contrarian than it did at the time, and the &lt;a href=&#34;https://pydevtools.com/blog/openai-acquires-astral/&#34;&gt;OpenAI acquisition of Astral&lt;/a&gt; in March changes the &amp;ldquo;is this safe to depend on&amp;rdquo; calculus at the same time.&lt;/p&gt;
&lt;h2&gt;Review pip&amp;rsquo;s 2025 to 2026 releases&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;review-pips-2025-to-2026-releases&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#review-pips-2025-to-2026-releases&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Four pip releases have landed since April 2025, and the first three narrowed gaps uv was best known for:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Astral told you how they secure uv. Here&#39;s what to keep.</title>
      <link>https://pydevtools.com/blog/astral-security-post-what-to-keep/</link>
      <pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/astral-security-post-what-to-keep/</guid>
      <description>&lt;p&gt;Astral published &lt;a href=&#34;https://astral.sh/blog/open-source-security-at-astral&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;a detailed writeup&lt;/a&gt; of how they secure the org that ships uv, Ruff, and ty. It&amp;rsquo;s a good post. It&amp;rsquo;s also, for most readers, the wrong post.&lt;/p&gt;
&lt;p&gt;Most of what Astral describes is team-scale GitHub hygiene: org-wide branch protection rulesets, workflow audits with &lt;code&gt;zizmor&lt;/code&gt;, action pinning with &lt;code&gt;pinact&lt;/code&gt;, isolated GitHub Apps for privileged operations. If you run a project with outside contributors, read the whole thing. If you&amp;rsquo;re one person shipping a Python package, a lot of it is overkill for the threat model you actually face.&lt;/p&gt;</description>
    </item>
    <item>
      <title>PyPI&#39;s Second Audit Found 14 Bugs. Two Remain.</title>
      <link>https://pydevtools.com/blog/pypi-second-security-audit/</link>
      <pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/pypi-second-security-audit/</guid>
      <description>&lt;p&gt;PyPI completed its &lt;a href=&#34;https://blog.pypi.org/posts/2026-04-16-pypi-completes-second-audit/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;second external security audit&lt;/a&gt; today. Trail of Bits found 14 issues in the Warehouse codebase: 2 High, 1 Medium, 7 Low, 3 Informational, 0 Critical. Twelve were patched. Two were accepted as known gaps. The work was funded by the &lt;a href=&#34;https://www.sovereign.tech/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Sovereign Tech Agency&lt;/a&gt;, with remediation by PSF&amp;rsquo;s Mike Fiedler through &lt;a href=&#34;https://alpha-omega.dev/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Alpha-Omega&lt;/a&gt; support.&lt;/p&gt;
&lt;p&gt;An audit of &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-pypi/&#34;&gt;PyPI&lt;/a&gt; is an audit of the index infrastructure, not of the packages hosted on it. None of the findings describe malware in the wild. The patched bugs are the predictable part; the accepted ones are where the signal lives.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Your Python Wheels Still Target 2009 CPUs</title>
      <link>https://pydevtools.com/blog/your-python-wheels-still-target-2009-cpus/</link>
      <pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/your-python-wheels-still-target-2009-cpus/</guid>
      <description>&lt;p&gt;Intel shipped AVX2 in 2013. AMD reached it with Excavator-era parts around 2015. Eleven years later, the default NumPy wheel &lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;pip&lt;/a&gt; downloads on an &lt;code&gt;x86_64&lt;/code&gt; Linux box is still compiled to run on processors from roughly 2003, the year AMD launched the Opteron and defined the AMD64 baseline. Every SIMD instruction that has shipped since is off-limits to the compiler that produced that wheel.&lt;/p&gt;
&lt;p&gt;The reason is structural. A &lt;a href=&#34;https://pydevtools.com/handbook/reference/wheel/&#34;&gt;wheel&lt;/a&gt; filename encodes three pieces of compatibility metadata: Python version, ABI, and platform. &amp;ldquo;Platform&amp;rdquo; for mainstream Linux wheels is typically &lt;code&gt;manylinux_2_17_x86_64&lt;/code&gt;, which says &amp;ldquo;works on any glibc 2.17+ x86-64 distro&amp;rdquo; and nothing about which CPU instruction sets the machine supports. When a project publishes one binary for all of those users, it has to target the lowest common denominator.&lt;/p&gt;</description>
    </item>
    <item>
      <title>uv won developer hearts. Now it has to win READMEs.</title>
      <link>https://pydevtools.com/blog/uv-admired-but-not-adopted/</link>
      <pubDate>Tue, 14 Apr 2026 09:00:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/uv-admired-but-not-adopted/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; ranked as the &lt;a href=&#34;https://survey.stackoverflow.co/2025/technology#admired-and-desired&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;most admired technology&lt;/a&gt; in Stack Overflow&amp;rsquo;s 2025 Developer Survey at 74%. A recent &lt;a href=&#34;https://aleyan.com/blog/2026-why-arent-we-uv-yet/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;analysis by Andrey Aleyan&lt;/a&gt; of the top 100,000 Python repositories on GitHub put uv adoption (measured by the presence of &lt;code&gt;uv.lock&lt;/code&gt;) at roughly 10%. The gap between &amp;ldquo;developers love this&amp;rdquo; and &amp;ldquo;developers ship this&amp;rdquo; is wider than any tooling story in recent memory.&lt;/p&gt;
&lt;p&gt;Aleyan&amp;rsquo;s diagnosis is that AI coding agents are the bottleneck: their training data is overwhelmingly &lt;code&gt;pip install -r requirements.txt&lt;/code&gt;, so they emit &lt;code&gt;pip install -r requirements.txt&lt;/code&gt;. That diagnosis is correct but incomplete. Adoption is bottlenecked by three reinforcing forces, and the AI-agent story is only one of them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Python Packaging Summit Returns to PyCon US</title>
      <link>https://pydevtools.com/blog/python-packaging-summit-2026/</link>
      <pubDate>Thu, 09 Apr 2026 12:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/python-packaging-summit-2026/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://us.pycon.org/2026/events/packaging-summit/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Python Packaging Summit&lt;/a&gt; returns Friday, May 15, 2026 in Room 201A of the Long Beach Convention Center, running 1:45 to 5:45 PM on the Friday of PyCon US. Pradyun Gedam, C.A.M. Gerlach, and Jannis Leidel co-chair again. Attendance is capped and invite-only: submit the &lt;a href=&#34;https://forms.gle/tu4zHaFYDCFFYMqx6&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;attendance form&lt;/a&gt; and &lt;a href=&#34;https://forms.gle/3ht7mTZ5N6FktnfH8&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;topic-pitch form&lt;/a&gt; by April 30 (AoE). The schedule drops around May 4.&lt;/p&gt;
&lt;p&gt;The summit puts the people who build &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;pip&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/poetry/&#34;&gt;Poetry&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/hatch/&#34;&gt;Hatch&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/conda/&#34;&gt;conda&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-pypi/&#34;&gt;PyPI&lt;/a&gt;, and the major &lt;a href=&#34;https://pydevtools.com/handbook/reference/wheel/&#34;&gt;wheel&lt;/a&gt;-producing libraries in one room to argue through the year&amp;rsquo;s thorniest packaging questions. The notes from &lt;a href=&#34;https://hackmd.io/@pradyunsg/pycon2024-pack-summit&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;2024&lt;/a&gt; and &lt;a href=&#34;https://hackmd.io/@pradyunsg/pycon2025-packaging-summit&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;2025&lt;/a&gt; are the best public window into where &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyproject.toml/&#34;&gt;pyproject.toml&lt;/a&gt;, wheel tags, and &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-a-lock-file/&#34;&gt;lock files&lt;/a&gt; are headed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>LLM-Powered Copycats Are Flooding PyPI</title>
      <link>https://pydevtools.com/blog/llm-powered-copycats-are-flooding-pypi/</link>
      <pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/llm-powered-copycats-are-flooding-pypi/</guid>
      <description>&lt;p&gt;A developer named Roman Dubrovin &lt;a href=&#34;https://pypi.org/project/repowise/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;published repowise&lt;/a&gt;, a tool for generating structured wikis from codebases, as his first PyPI package. The next morning, he searched for it on PyPI and found three new packages he didn&amp;rsquo;t recognize: &lt;code&gt;repowise-pro&lt;/code&gt;, &lt;code&gt;repowise-enhanced&lt;/code&gt;, and &lt;code&gt;repowise-next&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;All three had been uploaded within a 90-minute window. All three carried the same description: &amp;ldquo;Codebase intelligence that thinks ahead — outperforms repowise on every dimension.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;They weren&amp;rsquo;t empty shells. Someone had forked Dubrovin&amp;rsquo;s AGPL-3.0 licensed source code, run it through an LLM to patch a couple of minor issues, and republished under new names without attribution or license compliance. A community member &lt;a href=&#34;https://www.reddit.com/r/Python/comments/1sek3gq/i_published_my_first_pypi_package_few_ago_copycat/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;confirmed&lt;/a&gt; that all three packages traced back to the same person and the same GitHub repository.&lt;/p&gt;</description>
    </item>
    <item>
      <title>In 2012, Guido Had No Idea NumPy Had Its Own Packaging System</title>
      <link>https://pydevtools.com/blog/guido-had-no-idea-about-numpy-distutils/</link>
      <pubDate>Tue, 07 Apr 2026 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/guido-had-no-idea-about-numpy-distutils/</guid>
      <description>&lt;p&gt;In a &lt;a href=&#34;https://youtu.be/QjXJLVINsSA&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;recently resurfaced 2012 PyData panel discussion&lt;/a&gt;, Fernando Perez, Travis Oliphant, and David Cournapeau sat down with Guido van Rossum to discuss the scientific Python community&amp;rsquo;s needs. The conversation wandered through operator overloading (which eventually produced the &lt;code&gt;@&lt;/code&gt; matrix multiplication operator in Python 3.5) and import performance on supercomputers. The packaging segment is the one worth revisiting.&lt;/p&gt;
&lt;p&gt;David Cournapeau, who maintained NumPy&amp;rsquo;s build infrastructure, explained that NumPy had written its own packaging layer on top of &lt;a href=&#34;https://pydevtools.com/handbook/reference/distutils/&#34;&gt;distutils&lt;/a&gt; that was &amp;ldquo;as much code as distutils itself.&amp;rdquo; NumPy had to override nearly every piece of distutils to handle Fortran compilers, C++ extensions, &lt;a href=&#34;https://cython.org/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Cython&lt;/a&gt;, cross-platform compiler flags, and builds on exotic hardware like IBM Blue Gene supercomputers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>LiteLLM Got Owned, and Your Dependencies Might Be Next</title>
      <link>https://pydevtools.com/blog/litellm-supply-chain-attack-and-securing-python-dependencies/</link>
      <pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/litellm-supply-chain-attack-and-securing-python-dependencies/</guid>
      <description>&lt;p&gt;Earlier today, someone published malicious versions of &lt;a href=&#34;https://pypi.org/project/litellm/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;litellm&lt;/a&gt; (versions 1.82.7 and 1.82.8) to PyPI. No corresponding release appeared on GitHub. The package was uploaded directly to PyPI, bypassing the normal release process, which points to a compromised maintainer account or token.&lt;/p&gt;
&lt;h2&gt;What the malware did&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;what-the-malware-did&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#what-the-malware-did&#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 payload was a &lt;code&gt;.pth&lt;/code&gt; file named &lt;code&gt;litellm_init.pth&lt;/code&gt;. Python executes &lt;code&gt;.pth&lt;/code&gt; files automatically on interpreter startup, so the malware ran without any user interaction once the package was installed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How Python&#39;s RFC Process Paved the Way for uv, Ruff, and Ty</title>
      <link>https://pydevtools.com/blog/peps-and-astral/</link>
      <pubDate>Fri, 01 Aug 2025 15:22:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/peps-and-astral/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://astral.sh/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Astral&lt;/a&gt;, an independent startup, has taken the Python world by storm over the last few years with three fast, robust Python developer tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;ruff&lt;/a&gt; (linter and formatter)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; (packaging and project management)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt; (static type checker, still under development)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These tools came from the mind of Charlie Marsh, who is neither a Python core developer nor directed by the Python Steering Council. While being independently developed, these tools work seamlessly within the established Python ecosystem. This success stems partly from Astral&amp;rsquo;s attention to guidelines established by the Python Enhancement Proposal (&lt;a href=&#34;https://pydevtools.com/handbook/explanation/pep/&#34;&gt;PEP&lt;/a&gt;) process over the last twenty-five years.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why isn&#39;t Python packaging part of core development?</title>
      <link>https://pydevtools.com/blog/why-isnt-python-packaging-part-of-core-development/</link>
      <pubDate>Wed, 16 Jul 2025 10:51:00 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/why-isnt-python-packaging-part-of-core-development/</guid>
      <description>&lt;p&gt;In a &lt;a href=&#34;https://www.bitecode.dev/p/brett-cannon-on-python-humans-and&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;video interview with bitecode.dev&lt;/a&gt;, Python core developer Brett Cannon explains why packaging was never part of core development. The answer is disarmingly simple: the people in charge weren&amp;rsquo;t interested.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Basically, they&amp;rsquo;re separate because Guido doesn&amp;rsquo;t care about packaging. That&amp;rsquo;s really what it comes down to. When packaging started to become a thing, we just didn&amp;rsquo;t have any interest in it, and so it never became a core dev concern. It just never came up—it was just not our thing. So the community in various ways stepped up to fill that void.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The uv build backend is now stable</title>
      <link>https://pydevtools.com/blog/uv-build-backend/</link>
      <pubDate>Thu, 03 Jul 2025 01:29:29 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/uv-build-backend/</guid>
      <description>&lt;p&gt;For about a year, &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; has had a &lt;code&gt;uv build&lt;/code&gt; command for generating distributable &lt;a href=&#34;https://pydevtools.com/handbook/reference/wheel/&#34;&gt;wheels&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/sdist/&#34;&gt;source distributions&lt;/a&gt; on &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-pypi/&#34;&gt;pypi&lt;/a&gt; and elsewhere.&lt;/p&gt;
&lt;p&gt;However, uv has relied on other tools for the &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-a-build-backend/&#34;&gt;build backend&lt;/a&gt;, i.e. the actual piece constructing the wheel or sdist as defined by &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-pep-517/&#34;&gt;PEP 517&lt;/a&gt;. By default, uv uses &lt;a href=&#34;https://pydevtools.com/handbook/reference/hatch/&#34;&gt;hatchling&lt;/a&gt; as the build backend.&lt;/p&gt;
&lt;p&gt;As of this week, the uv team has now declared the uv build backend as stable and, most notably, really, really fast. &lt;a href=&#34;https://x.com/charliermarsh/status/1940583972607873226&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Charlie Marsh&amp;rsquo;s benchmarks&lt;/a&gt; suggest that it&amp;rsquo;s 10 to 35 times faster than &lt;a href=&#34;https://pydevtools.com/handbook/reference/flit/&#34;&gt;flit&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/hatch/&#34;&gt;hatchling&lt;/a&gt;, and &lt;a href=&#34;https://pydevtools.com/handbook/reference/setuptools/&#34;&gt;setuptools&lt;/a&gt;. While I&amp;rsquo;ve never really needed my package builds to be faster, I&amp;rsquo;ve learned that &lt;a href=&#34;https://x.com/tdhopper/status/1850885052894196149&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;faster tools often enable new things I didn&amp;rsquo;t imagine possible&lt;/a&gt;; I&amp;rsquo;m interested to see what those might be here.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setuptools 78.0.1 breaking package installation</title>
      <link>https://pydevtools.com/blog/setuptools-78-0-1-breaking-package-installation/</link>
      <pubDate>Mon, 24 Mar 2025 13:54:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/setuptools-78-0-1-breaking-package-installation/</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;Update: Setuptools released &lt;a href=&#34;https://setuptools.pypa.io/en/stable/history.html#bugfixes&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;version 78.0.2 postponing this breaking change&lt;/a&gt;.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;A recent update to setuptools (&lt;a href=&#34;https://setuptools.pypa.io/en/latest/history.html#deprecations-and-removals&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;version 78.0.1&lt;/a&gt;) is breaking installations of many packages, particularly older or unmaintained ones that use dash-separated keys instead of the now-required underscore format.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why Doesn&#39;t the Authoritative Python Packaging Guide Mention the Best Thing that&#39;s Happened to Python Packaging?</title>
      <link>https://pydevtools.com/blog/uv-not-in-ppug/</link>
      <pubDate>Thu, 27 Feb 2025 14:56:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/uv-not-in-ppug/</guid>
      <description>&lt;p&gt;Despite &lt;a href=&#34;https://docs.astral.sh/uv/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv&lt;/a&gt;&amp;rsquo;s meteoric rise and widespread adoption in the Python community over the last year, the excellent and official &lt;a href=&#34;https://packaging.python.org/en/latest/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Python Packaging User Guide&lt;/a&gt; (PPUG) at &lt;a href=&#34;https://packaging.python.org/en/latest/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;packaging.python.org&lt;/a&gt; makes no mention of it. Understanding why this is requires some background knowledge and unveils understanding of the modern Python developer tooling ecosystem.&lt;/p&gt;
&lt;h2&gt;uv&amp;rsquo;s Rise&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;uvs-rise&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#uvs-rise&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Since its introduction in early 2024, uv has rapidly gained traction as a high-performance alternative to existing Python tooling. uv delivers 10-100x faster package operations than traditional tools while consolidating functionality previously spread across multiple utilities (pip, pip-tools, virtualenv, pyenv, and more). Its performance advantages, cross-platform support, and unified approach have made it increasingly popular among Python developers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Poetry&#39;s Move Toward Python Standards</title>
      <link>https://pydevtools.com/blog/poetry2/</link>
      <pubDate>Fri, 21 Feb 2025 16:08:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/poetry2/</guid>
      <description>&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:rounded-lg hx:border hx:py-2 hx:ltr:pr-4 hx:rtl:pl-4 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200&#34;&gt;
  &lt;div class=&#34;hx:ltr:pl-3 hx:ltr:pr-2 hx:rtl:pr-3 hx:rtl:pl-2&#34;&gt;&lt;svg height=1.2em class=&#34;hx:inline-block hx:align-middle&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;

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

&lt;p&gt;While modern Python build tools like uv, Hatch, PDM, and Flit embraced &lt;a href=&#34;https://peps.python.org/pep-0621/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PEP 621&lt;/a&gt;&amp;rsquo;s standardized project metadata from their inception, Poetry - one of the most widely used packaging tools - maintained its own configuration format in &lt;code&gt;tool.poetry&lt;/code&gt; until version 2.0. This delay reflected both Poetry&amp;rsquo;s established user base and its richer feature set beyond standard packaging needs.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why Use uv Projects Instead of requirements.txt?</title>
      <link>https://pydevtools.com/blog/requirementstxt-vs-pyprojecttoml/</link>
      <pubDate>Wed, 19 Feb 2025 09:17:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/requirementstxt-vs-pyprojecttoml/</guid>
      <description>&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:rounded-lg hx:border hx:py-2 hx:ltr:pr-4 hx:rtl:pl-4 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200&#34;&gt;
  &lt;div class=&#34;hx:ltr:pl-3 hx:ltr:pr-2 hx:rtl:pr-3 hx:rtl:pl-2&#34;&gt;&lt;svg height=1.2em class=&#34;hx:inline-block hx:align-middle&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;

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

&lt;p&gt;The Python ecosystem offers two main approaches to managing project dependencies: the traditional requirements.txt file and the newer &lt;a href=&#34;https://packaging.python.org/en/latest/guides/writing-pyproject-toml/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pyproject.toml&lt;/a&gt; standard. Understanding the strengths and limitations of each helps inform better choices for Python development.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Effective Python Developer Tooling in December 2024</title>
      <link>https://pydevtools.com/blog/effective-python-developer-tooling-in-december-2024/</link>
      <pubDate>Fri, 20 Dec 2024 19:25:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/effective-python-developer-tooling-in-december-2024/</guid>
      <description>&lt;p&gt;I have been writing Python for 14 years next month. When I started, people were still using easy_install to install egg-based packages for Python 2.7 and nobody had heard about Conda yet, much less uv. The Python tool ecosystem has changed since. Many people are confused by the &lt;a href=&#34;https://xkcd.com/1987/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;fragmentation&lt;/a&gt; in the ecosystem, but we have better tooling for Python today than we&amp;rsquo;ve ever had before.&lt;/p&gt;
&lt;p&gt;A friend recently invited me to give a talk to his team about Python tooling. In the presentation, I shared some principles of Python tooling and developer efficiency, some anti-patterns I&amp;rsquo;ve observed, recommended practices, and an opinionated list of tools I like in December 2024. What follows is a summary of that talk.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Require pip to install packages in virtual environment</title>
      <link>https://pydevtools.com/blog/require-pip-to-install-in-virtual-environments/</link>
      <pubDate>Mon, 04 Mar 2024 15:34:08 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/require-pip-to-install-in-virtual-environments/</guid>
      <description>&lt;p&gt;A frequently heard piece of advice in improving Python development practice is using &lt;a href=&#34;https://docs.python.org/3/library/venv.html&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;virtual environments&lt;/a&gt; to install dependencies. Virtual environments isolate your dependencies per project to protect you from annoying version conflicts.&lt;/p&gt;
&lt;p&gt;You can restrict pip to only install in virtual environments by running&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip config &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; global.require-virtualenv true&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 updates your global &lt;a href=&#34;https://pip.pypa.io/en/stable/topics/configuration/#location&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pip config file&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pip and Poetry and Hatch, Oh My!</title>
      <link>https://pydevtools.com/blog/pip-and-poetry-and-hatch-oh-my/</link>
      <pubDate>Wed, 14 Feb 2024 20:51:18 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/pip-and-poetry-and-hatch-oh-my/</guid>
      <description>&lt;p&gt;Modern Python developers have a plethora of tooling available to help the development process. When I started with Python in 2011, packaging was done with &lt;a href=&#34;https://pydevtools.com/handbook/reference/setuptools/&#34;&gt;setuptools&lt;/a&gt; (or its predecessor distutils), and virtual environments were created with the &lt;a href=&#34;https://pydevtools.com/handbook/reference/virtualenv/&#34;&gt;virtualenv&lt;/a&gt; library.&lt;/p&gt;
&lt;p&gt;Now developers can (have to?) choose between a breadth of packaging tools (e.g., &lt;a href=&#34;https://pydevtools.com/handbook/reference/setuptools/&#34;&gt;setuptools&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/flit/&#34;&gt;Flit&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/poetry/&#34;&gt;Poetry&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/pdm/&#34;&gt;PDM&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/hatch/&#34;&gt;Hatch&lt;/a&gt;). Some of these tools manage virtual environments while others require the developer to do this themself. Every developer managing virtual environments has had to figure out the difference between &lt;a href=&#34;https://pydevtools.com/handbook/reference/venv/&#34;&gt;venv&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/virtualenv/&#34;&gt;virtualenv&lt;/a&gt;&amp;ndash;not to mention wondering how they differ from &lt;a href=&#34;https://pydevtools.com/handbook/reference/conda/&#34;&gt;Conda&lt;/a&gt; environments.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scientific Python Library Development Guide</title>
      <link>https://pydevtools.com/blog/scientific-python-library-development-guide/</link>
      <pubDate>Mon, 12 Feb 2024 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/scientific-python-library-development-guide/</guid>
      <description>&lt;p&gt;Along with the &lt;a href=&#34;https://packaging.python.org/en/latest/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Python Packaging User Guide&lt;/a&gt;,
another excellent resource for learning about Python development practice is the
&lt;a href=&#34;https://learn.scientific-python.org/development/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Scientific Python Library Development
Guide&lt;/a&gt;, a &amp;ldquo;guide is maintained by the
scientific Python community for the benefit of fellow scientists and research software
engineers&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I especially like their &lt;a href=&#34;https://learn.scientific-python.org/development/guides/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;topical
guides&lt;/a&gt; on topics like
&lt;a href=&#34;https://learn.scientific-python.org/development/guides/packaging-simple/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;packaging&lt;/a&gt;
and &lt;a href=&#34;https://learn.scientific-python.org/development/guides/gha-basic/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;getting started with Github Actions&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python Packaging Tool Examples</title>
      <link>https://pydevtools.com/blog/packaging-tool-examples/</link>
      <pubDate>Tue, 06 Feb 2024 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/packaging-tool-examples/</guid>
      <description>&lt;p&gt;In the last few years, Python packaging has seen a lot of change. Instead of every
project using setuptools/setup.py, there are now many tools to choose from when building
and distributing Python packages. This can be overwhelming for new and experienced
developers alike.&lt;/p&gt;
&lt;p&gt;My goal with the Python Developer Tooling Handbook is to help you make informed choices
to make your Python development easier and more productive.&lt;/p&gt;
&lt;p&gt;As I&amp;rsquo;ve tried to learn the ins-and-outs of these tools, I created a series of example
repositories showing how to use each of the major packaging tools. I hope these examples
will be helpful to you as you learn about Python packaging.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introduction to Rye</title>
      <link>https://pydevtools.com/blog/introduction-to-rye/</link>
      <pubDate>Sat, 03 Feb 2024 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/introduction-to-rye/</guid>
      <description>&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200&#34;&gt;
  &lt;p class=&#34;hx:flex hx:items-center hx:font-medium&#34;&gt;&lt;svg height=16px class=&#34;hx:inline-block hx:align-middle hx:mr-2&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z&#34;/&gt;&lt;/svg&gt;Note&lt;/p&gt;

  &lt;div class=&#34;hx:w-full hx:min-w-0 hx:leading-7&#34;&gt;
    &lt;div class=&#34;hx:mt-6 hx:leading-7 hx:first:mt-0&#34;&gt;&lt;p&gt;Rye&amp;rsquo;s author Armin Ronacher now recommends &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; for new projects. Rye continues as a maintained project, but uv has become the primary focus for modern Python tooling. See &lt;a href=&#34;https://docs.astral.sh/uv/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv&amp;rsquo;s documentation&lt;/a&gt; for migration guidance.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python Packaging User Guide</title>
      <link>https://pydevtools.com/blog/python-packaging-user-guide/</link>
      <pubDate>Sat, 03 Feb 2024 00:00:00 +0000</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/blog/python-packaging-user-guide/</guid>
      <description>&lt;p&gt;The Python Packaging Authority produces an excellent resource called the &lt;a href=&#34;https://packaging.python.org/en/latest/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Python
Packaging User Guide&lt;/a&gt;, &amp;ldquo;a collection of
tutorials and references to help you distribute and install Python packages with modern
tools&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re feeling frustrated by Python packaging, I highly recommend reading through
this guide and considering it&amp;rsquo;s suggestions.&lt;/p&gt;
&lt;p&gt;My forthcoming Python Developer Tooling Handbook will cover much of the same material,
but it intended as a complement to the Python Packaging User Guide, not a replacement.&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
