<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Behzad Seyfi</title>
    <description>The latest articles on DEV Community by Behzad Seyfi (@bseyfi).</description>
    <link>https://dev.to/bseyfi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F991637%2F2199ef9c-cf28-42b8-9a52-c74d5bf92649.jpeg</url>
      <title>DEV Community: Behzad Seyfi</title>
      <link>https://dev.to/bseyfi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bseyfi"/>
    <language>en</language>
    <item>
      <title>🐍 Fix Pyenv Messing Up Your Distrobox (Pop!_OS, Ubuntu, Fedora, etc.)</title>
      <dc:creator>Behzad Seyfi</dc:creator>
      <pubDate>Thu, 25 Sep 2025 13:42:55 +0000</pubDate>
      <link>https://dev.to/bseyfi/fix-pyenv-messing-up-your-distrobox-popos-ubuntu-fedora-etc-22am</link>
      <guid>https://dev.to/bseyfi/fix-pyenv-messing-up-your-distrobox-popos-ubuntu-fedora-etc-22am</guid>
      <description>&lt;p&gt;You’ve set up your dream development environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your &lt;strong&gt;host system&lt;/strong&gt; (maybe &lt;strong&gt;Pop!_OS&lt;/strong&gt;, &lt;strong&gt;Ubuntu&lt;/strong&gt;, or something similar) uses &lt;strong&gt;&lt;code&gt;pyenv&lt;/code&gt;&lt;/strong&gt; to manage many Python versions.&lt;/li&gt;
&lt;li&gt;For clean, reproducible builds, you spin up a &lt;strong&gt;Fedora&lt;/strong&gt; container with &lt;strong&gt;Distrobox&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It feels like the best of both worlds… until something breaks.&lt;/p&gt;

&lt;p&gt;Inside your container you type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~&lt;span class="nv"&gt;$ &lt;/span&gt;which python3
~/.pyenv/shims/python3  😖😩
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of Fedora’s Python, it points to your host’s &lt;strong&gt;&lt;code&gt;~/.pyenv/shims/python3&lt;/code&gt;&lt;/strong&gt;.&lt;br&gt;
Your container isn’t clean anymore — your host has leaked into it.&lt;/p&gt;

&lt;p&gt;Don’t panic. This is a common issue, and the fix is simple once you know what’s happening.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚡ The Hidden Culprit: A Pyenv Shell Function
&lt;/h2&gt;

&lt;p&gt;At first, you may think the problem is just the &lt;strong&gt;&lt;code&gt;$PATH&lt;/code&gt;&lt;/strong&gt;.&lt;br&gt;
But that’s only part of the story.&lt;/p&gt;

&lt;p&gt;The real issue is a &lt;strong&gt;pyenv shell function&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When you run this on your host:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;pyenv init -&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…it doesn’t only change your path. It also creates a &lt;strong&gt;function&lt;/strong&gt; that overrides &lt;code&gt;python&lt;/code&gt;. This function gets copied into your Distrobox container and takes priority over any path fixes you try.&lt;/p&gt;

&lt;p&gt;So, to solve this:&lt;br&gt;
👉 You need to &lt;strong&gt;remove the shell function&lt;/strong&gt; and &lt;strong&gt;clean the path&lt;/strong&gt; inside the container.&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠️ The Smart &lt;code&gt;.bashrc&lt;/code&gt; Fix
&lt;/h2&gt;

&lt;p&gt;The best solution is to make your &lt;strong&gt;&lt;code&gt;.bashrc&lt;/code&gt;&lt;/strong&gt; “smart.”&lt;br&gt;
With one block of code, it can detect whether you are on the &lt;strong&gt;host&lt;/strong&gt; (Pop!_OS/Ubuntu) or inside a &lt;strong&gt;container&lt;/strong&gt; (Fedora or others).&lt;/p&gt;

&lt;p&gt;Replace your current pyenv settings with this block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ==================================================================&lt;/span&gt;
&lt;span class="c"&gt;# Pyenv &amp;amp; Distrobox Isolation&lt;/span&gt;
&lt;span class="c"&gt;# ==================================================================&lt;/span&gt;
&lt;span class="c"&gt;# Works on host (Pop!_OS, Ubuntu, etc.) and keeps containers (Fedora, etc.)&lt;/span&gt;
&lt;span class="c"&gt;# completely clean.&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONTAINER_ID&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="c"&gt;# --- HOST SYSTEM ---&lt;/span&gt;
    &lt;span class="c"&gt;# Normal pyenv setup&lt;/span&gt;
    &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PYENV_ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.pyenv"&lt;/span&gt;
    &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PYENV_ROOT&lt;/span&gt;&lt;span class="s2"&gt;/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;pyenv init -&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="c"&gt;# --- GUEST (Distrobox Container) ---&lt;/span&gt;
    &lt;span class="c"&gt;# Aggressively decontaminate the inherited host environment.&lt;/span&gt;

    &lt;span class="c"&gt;# 1. Disable the pyenv shell function&lt;/span&gt;
    pyenv&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      : &lt;span class="c"&gt;# Does nothing&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;# 2. Rebuild PATH without pyenv entries&lt;/span&gt;
    &lt;span class="nv"&gt;_CLEAN_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;
    &lt;span class="nv"&gt;OLD_IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$IFS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;':'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;p &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
        case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
            &lt;span class="c"&gt;# Explicitly skip any path containing .pyenv&lt;/span&gt;
            &lt;span class="k"&gt;*&lt;/span&gt;/.pyenv&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;;;&lt;/span&gt; &lt;span class="c"&gt;# Skip pyenv paths&lt;/span&gt;
            &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
                    &lt;/span&gt;&lt;span class="nv"&gt;_CLEAN_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;_CLEAN_PATH&lt;/span&gt;:+&lt;span class="nv"&gt;$_CLEAN_PATH&lt;/span&gt;:&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
                &lt;span class="k"&gt;fi&lt;/span&gt;
                &lt;span class="p"&gt;;;&lt;/span&gt;
        &lt;span class="k"&gt;esac&lt;/span&gt;
    &lt;span class="k"&gt;done&lt;/span&gt;
    &lt;span class="c"&gt;# Prepend the container's native paths to guarantee priority.&lt;/span&gt;
    &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;_CLEAN_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OLD_IFS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;unset &lt;/span&gt;_CLEAN_PATH OLD_IFS
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After saving, &lt;strong&gt;close and reopen your terminals&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On your &lt;strong&gt;host&lt;/strong&gt; (Pop!_OS/Ubuntu), pyenv works as usual.&lt;/li&gt;
&lt;li&gt;Inside your &lt;strong&gt;Fedora container&lt;/strong&gt;, you’ll get a clean, native &lt;code&gt;/usr/bin/python3&lt;/code&gt; 🤩😍.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Why This Is the Right Fix
&lt;/h2&gt;

&lt;p&gt;This isn’t a quick hack — it’s a &lt;strong&gt;clean, long-term solution&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One-time setup:&lt;/strong&gt; Update &lt;code&gt;.bashrc&lt;/code&gt; once, and forget about it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;True isolation:&lt;/strong&gt; Both &lt;code&gt;$PATH&lt;/code&gt; and the shell function are handled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Future-proof:&lt;/strong&gt; If you later install pyenv inside the container, it works correctly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear boundaries:&lt;/strong&gt; Keeps host and container separate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Works only for &lt;strong&gt;bash&lt;/strong&gt;. If you use &lt;code&gt;zsh&lt;/code&gt; or &lt;code&gt;fish&lt;/code&gt;, you’ll need to adapt it.&lt;/li&gt;
&lt;li&gt;Depends on &lt;code&gt;.bashrc&lt;/code&gt; being loaded properly.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎯 Conclusion
&lt;/h2&gt;

&lt;p&gt;With this fix, you get the best of both worlds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Host (Pop!_OS/Ubuntu/ etc.):&lt;/strong&gt; full pyenv power.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container (Fedora or other Distrobox guests):&lt;/strong&gt; clean, isolated Python environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now you can code with confidence, without pyenv sneaking into places it doesn’t belong.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>distrobox</category>
      <category>pyenv</category>
      <category>bash</category>
    </item>
  </channel>
</rss>
