<?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: Erick Eduardo Ramos</title>
    <description>The latest articles on DEV Community by Erick Eduardo Ramos (@erickeduardoramos03).</description>
    <link>https://dev.to/erickeduardoramos03</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%2F3943545%2Ff8b96fcc-b7e6-4c21-a809-3c6ffedaea58.png</url>
      <title>DEV Community: Erick Eduardo Ramos</title>
      <link>https://dev.to/erickeduardoramos03</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/erickeduardoramos03"/>
    <language>en</language>
    <item>
      <title>Cómo solucionar el bucle infinito en useEffect con objetos y arrays en React</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Fri, 22 May 2026 11:41:04 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-el-bucle-infinito-en-useeffect-con-objetos-y-arrays-en-react-458n</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-el-bucle-infinito-en-useeffect-con-objetos-y-arrays-en-react-458n</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar el bucle infinito en useEffect con objetos y arrays en React
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Explicación técnica (por qué ocurre)
&lt;/h2&gt;

&lt;p&gt;El problema ocurre porque &lt;strong&gt;React compara las dependencias del &lt;code&gt;useEffect&lt;/code&gt; usando comparación &lt;code&gt;===&lt;/code&gt; (igualdad estricta)&lt;/strong&gt;, no por contenido (deep equality). Cuando usas &lt;code&gt;useState({})&lt;/code&gt;, cada llamada a &lt;code&gt;setObj({})&lt;/code&gt; crea un &lt;strong&gt;nuevo objeto en memoria&lt;/strong&gt;, aunque tenga el mismo contenido. Por lo tanto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;[obj]&lt;/code&gt; como dependencia → React compara &lt;code&gt;obj1 === obj2&lt;/code&gt; → siempre &lt;code&gt;false&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Esto dispara el &lt;code&gt;useEffect&lt;/code&gt; infinitamente → actualiza estado → re-renders → nuevo objeto → efecto se dispara de nuevo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este comportamiento es &lt;strong&gt;intencional&lt;/strong&gt; en React para evitar costosas comparaciones profundas por defecto.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pasos para solucionarlo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Opción 1: Evitar la actualización innecesaria (recomendada)
&lt;/h3&gt;

&lt;p&gt;No vuelvas a establecer el mismo valor si no es necesario. Usa una condición para evitar la actualización:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Solo actualiza si el objeto no está vacío&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setIngredients&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Opción 2: Usar comparación profunda manual (cuando necesitas reaccionar a cambios específicos)
&lt;/h3&gt;

&lt;p&gt;Implementa una comparación profunda con &lt;code&gt;JSON.stringify&lt;/code&gt; (solo para objetos simples sin funciones/circularidades):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// Simula comparación profunda&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({}))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setIngredients&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Opción 3: Usar &lt;code&gt;useMemo&lt;/code&gt; para crear una referencia estable (patrón avanzado)
&lt;/h3&gt;

&lt;p&gt;Si necesitas mantener una referencia estable para evitar re-renders:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emptyIngredients&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useMemo&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({}),&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setIngredients&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emptyIngredients&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;emptyIngredients&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Opción 4: Separar dependencias (patrón más limpio)
&lt;/h3&gt;

&lt;p&gt;Divide el estado en valores primitivos cuando sea posible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setList&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;

&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;setList&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Bloque de código corregido (solución definitiva)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Caso de uso típico: limpiar estado al montar el componente&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIngredients&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Inicializa con valores por defecto solo al montar&lt;/span&gt;
    &lt;span class="nf"&gt;setIngredients&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt; &lt;span class="c1"&gt;// ← Dependencia vacía: solo se ejecuta una vez&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Caso de uso: limpiar estado cuando cambia una condición específica&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Solo limpiar si hay datos&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setIngredients&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Pro-tip: Buenas prácticas con objetos y arrays en hooks
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Nunca uses objetos/array literales como dependencias&lt;/strong&gt; (&lt;code&gt;[{}]&lt;/code&gt;, &lt;code&gt;[{...}]&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Para comparaciones profundas, usa librerías como &lt;code&gt;fast-deep-equal&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;   &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;deepEqual&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fast-deep-equal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

   &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;deepEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nf"&gt;setIngredients&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Considera usar &lt;code&gt;useReducer&lt;/code&gt; para estados complejos&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;initialState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reducer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;reset&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
       &lt;span class="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;};&lt;/span&gt;

   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useReducer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Siempre pregunta: ¿realmente necesito este &lt;code&gt;useEffect&lt;/code&gt;?&lt;/strong&gt; Muchas veces la lógica puede moverse a eventos directos (&lt;code&gt;onClick&lt;/code&gt;, &lt;code&gt;onChange&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Advertencia crítica&lt;/strong&gt;: &lt;code&gt;JSON.stringify&lt;/code&gt; es costoso en rendimiento. Úsalo solo para objetos pequeños y nunca en componentes que rendericen frecuentemente.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>spanish</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cómo solucionar el error de permiso al ejecutar `pip.exe` en un entorno virtual de Python en Windows</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Fri, 22 May 2026 07:49:15 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-el-error-de-permiso-al-ejecutar-pipexe-en-un-entorno-virtual-de-python-en-windows-dp7</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-el-error-de-permiso-al-ejecutar-pipexe-en-un-entorno-virtual-de-python-en-windows-dp7</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar el error de permiso al ejecutar &lt;code&gt;pip.exe&lt;/code&gt; en un entorno virtual de Python en Windows
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Explicación técnica
&lt;/h2&gt;

&lt;p&gt;El problema ocurre porque el archivo &lt;code&gt;pip.exe&lt;/code&gt; en el directorio &lt;code&gt;Scripts/&lt;/code&gt; de tu entorno virtual es un &lt;em&gt;launcher&lt;/em&gt; empaquetado (un ZIP autoextraíble) que contiene una ruta fija a &lt;code&gt;python.exe&lt;/code&gt;. Cuando se crea el entorno virtual, este launcher se "quema" con la ruta exacta del &lt;code&gt;python.exe&lt;/code&gt; usado para crearlo.&lt;/p&gt;

&lt;p&gt;Si has reinstalado Python múltiples veces (desde python.org, Microsoft Store, múltiples versiones), es muy probable que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El &lt;code&gt;python.exe&lt;/code&gt; original ya no exista en la ruta grabada dentro de &lt;code&gt;pip.exe&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;El sistema intente ejecutar una ruta rota → falla con "Access is denied" (error genérico de Windows cuando no puede cargar el binario o su dependencia)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;python -m pip&lt;/code&gt; funcione porque usa el &lt;code&gt;python.exe&lt;/code&gt; actual del entorno activado, no el launcher empaquetado&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este no es un problema de permisos de archivo (como verificaste con &lt;code&gt;icacls&lt;/code&gt;), sino de &lt;strong&gt;rutas rotas embebidas en el launcher&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pasos para solucionarlo definitivamente
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Elimina el entorno virtual corrupto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Desde PowerShell o CMD (NO bash)&lt;/span&gt;
rd /s /q &lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\U&lt;/span&gt;&lt;span class="s2"&gt;sers&lt;/span&gt;&lt;span class="se"&gt;\&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;username&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;project dir&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\v&lt;/span&gt;&lt;span class="s2"&gt;env"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Crea un nuevo entorno virtual &lt;strong&gt;desde el Python correcto&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verifica la versión exacta que necesitas:&lt;/span&gt;
&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;ath&lt;/span&gt;&lt;span class="se"&gt;\T&lt;/span&gt;&lt;span class="s2"&gt;o&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;ython310&lt;/span&gt;&lt;span class="se"&gt;\p&lt;/span&gt;&lt;span class="s2"&gt;ython.exe"&lt;/span&gt; &lt;span class="nt"&gt;--version&lt;/span&gt;

&lt;span class="c"&gt;# Crea el entorno con ese binario explícitamente:&lt;/span&gt;
&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;ath&lt;/span&gt;&lt;span class="se"&gt;\T&lt;/span&gt;&lt;span class="s2"&gt;o&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;ython310&lt;/span&gt;&lt;span class="se"&gt;\p&lt;/span&gt;&lt;span class="s2"&gt;ython.exe"&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Importante&lt;/strong&gt;: Usa siempre la ruta absoluta al &lt;code&gt;python.exe&lt;/code&gt; deseado. Evita usar &lt;code&gt;py -3.10&lt;/code&gt; o variables de entorno que puedan cambiar.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. Verifica que el launcher funcione
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ejecuta directamente el launcher nuevo (sin activar venv):&lt;/span&gt;
&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\U&lt;/span&gt;&lt;span class="s2"&gt;sers&lt;/span&gt;&lt;span class="se"&gt;\&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;username&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;project dir&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\v&lt;/span&gt;&lt;span class="s2"&gt;env&lt;/span&gt;&lt;span class="se"&gt;\S&lt;/span&gt;&lt;span class="s2"&gt;cripts&lt;/span&gt;&lt;span class="se"&gt;\p&lt;/span&gt;&lt;span class="s2"&gt;ip.exe"&lt;/span&gt; &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Debería mostrar algo como: &lt;code&gt;pip 23.x.x from ... (python 3.10)&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Usa siempre &lt;code&gt;python -m pip&lt;/code&gt; como práctica segura (recomendado)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Activa el entorno normalmente&lt;/span&gt;
.&lt;span class="se"&gt;\v&lt;/span&gt;&lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="se"&gt;\S&lt;/span&gt;cripts&lt;span class="se"&gt;\a&lt;/span&gt;ctivate

&lt;span class="c"&gt;# Usa siempre este formato:&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Bloque de código corregido (script de diagnóstico para futuras referencias)
&lt;/h2&gt;

&lt;p&gt;Si necesitas inspeccionar el &lt;code&gt;pip.exe&lt;/code&gt; en el futuro, guarda este script como &lt;code&gt;check_pip_launcher.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_pip_launcher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pip_exe_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pip_exe_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ERROR: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pip_exe_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; no existe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pip_exe_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Busca el ZIP central directory (PK\x05\x06)
&lt;/span&gt;    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rfind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PK&lt;/span&gt;&lt;span class="se"&gt;\x05\x06&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ERROR: No se encontró el ZIP central directory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="c1"&gt;# Busca el shebang: b'#!' antes del ZIP
&lt;/span&gt;    &lt;span class="n"&gt;i0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rfind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="n"&gt;i1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i0&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;i1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ERROR: No se encontró el shebang (#!)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="n"&gt;python_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;i1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'"'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;replace&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ruta embebida en pip.exe: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;python_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;python_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;⚠️  CRÍTICO: El python.exe apuntado NO EXISTE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   Solución: Re-crea el entorno virtual con el python correcto&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅ Python embebido existe y es accesible&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Uso: python check_pip_launcher.py &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;path&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;pip.exe&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;check_pip_launcher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejecútalo &lt;strong&gt;desde CMD/PowerShell&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python check_pip_launcher.py "C:\Users\&amp;lt;username&amp;gt;\&amp;lt;project&amp;gt;\venv\Scripts\pip.exe"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Pro-tip: Evita este problema en el futuro
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Práctica&lt;/th&gt;
&lt;th&gt;Por qué ayuda&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nunca muevas/renombres el entorno virtual&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rutas absolutas se rompen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Usa &lt;code&gt;python -m pip&lt;/code&gt; en lugar de &lt;code&gt;pip&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Evita el launcher empaquetado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Crea entornales con &lt;code&gt;python -m venv&lt;/code&gt; usando el binario explícito&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Garantiza consistencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Evita mezclar instaladores de python.org y Microsoft Store&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cada uno usa rutas y metadatos distintos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Considera usar &lt;code&gt;py -3.10 -m venv venv&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Usa el launcher &lt;code&gt;py.exe&lt;/code&gt; que maneja versiones dinámicamente&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;🔥 &lt;strong&gt;Solución definitiva&lt;/strong&gt;: Si el problema persiste tras recrear el entorno, ejecuta &lt;code&gt;sfc /scannow&lt;/code&gt; en CMD como administrador. A veces, archivos del sistema de Windows (como &lt;code&gt;python.exe&lt;/code&gt; o dependencias DLL) se corrompen y afectan la ejecución de launchers empaquetados.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>cli</category>
      <category>python</category>
      <category>spanish</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cómo solucionar `docker run` con `Exited (1)` en Raspberry Pi</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Fri, 22 May 2026 06:14:24 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-docker-run-con-exited-1-en-raspberry-pi-1n6g</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-docker-run-con-exited-1-en-raspberry-pi-1n6g</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar &lt;code&gt;docker run&lt;/code&gt; con &lt;code&gt;Exited (1)&lt;/code&gt; en Raspberry Pi
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ¿Por qué ocurre este error?
&lt;/h2&gt;

&lt;p&gt;El código de salida &lt;code&gt;1&lt;/code&gt; indica que el proceso principal del contenedor terminó con un error genérico. En Raspberry Pi, los casos más comunes son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Incompatibilidad de arquitectura&lt;/strong&gt;: La imagen fue construida para &lt;code&gt;amd64&lt;/code&gt; (x86_64) pero Raspberry Pi usa &lt;code&gt;armhf&lt;/code&gt; o &lt;code&gt;arm64&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Falta de binarios compatibles&lt;/strong&gt;: El &lt;code&gt;ENTRYPOINT&lt;/code&gt; o &lt;code&gt;CMD&lt;/code&gt; del contenedor ejecuta un binario compilado para otra arquitectura.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problemas de permisos o recursos limitados&lt;/strong&gt; (menos común, pero posible en dispositivos con poca RAM).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uso incorrecto de &lt;code&gt;--net=host&lt;/code&gt;&lt;/strong&gt;: En algunas versiones de Docker en Raspberry Pi, esto puede causar fallos si el sistema no lo soporta correctamente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La evidencia clave: &lt;em&gt;funciona en una VM de Raspberry Pi pero no en hardware real&lt;/em&gt; → sugiere una diferencia en la arquitectura de la imagen o en la versión de Docker.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pasos para solucionarlo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Verifica la arquitectura de tu imagen y del host
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# En tu Raspberry Pi:&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;
&lt;span class="c"&gt;# Salida esperada: armv7l (Raspberry Pi 3/4 32-bit) o aarch64 (Raspberry Pi 4/5 64-bit)&lt;/span&gt;

docker info | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"Architecture"&lt;/span&gt;
&lt;span class="c"&gt;# Debe coincidir con lo anterior&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Verifica si la imagen es compatible
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker inspect myimage | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-A5&lt;/span&gt; &lt;span class="s1"&gt;'"Architecture"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si ves &lt;code&gt;"Architecture": "amd64"&lt;/code&gt;, &lt;strong&gt;la imagen no es compatible&lt;/strong&gt; con ARM.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Reconstruye la imagen para ARM (solución definitiva)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Opción A: Usa &lt;code&gt;docker buildx&lt;/code&gt; (recomendado)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Crea un nuevo builder con soporte multiplataforma&lt;/span&gt;
docker buildx create &lt;span class="nt"&gt;--use&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; mybuilder

&lt;span class="c"&gt;# Inicia el builder&lt;/span&gt;
docker buildx inspect &lt;span class="nt"&gt;--bootstrap&lt;/span&gt;

&lt;span class="c"&gt;# Construye para ARMv7 (Raspberry Pi 3/4 32-bit) o ARM64 (Raspberry Pi 4/5 64-bit)&lt;/span&gt;
&lt;span class="c"&gt;# Para 32-bit:&lt;/span&gt;
docker buildx build &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/arm/v7 &lt;span class="nt"&gt;-t&lt;/span&gt; myimage:armv7 &lt;span class="nt"&gt;--push&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; 

&lt;span class="c"&gt;# Para 64-bit (si usas Raspberry Pi OS 64-bit):&lt;/span&gt;
docker buildx build &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/arm64 &lt;span class="nt"&gt;-t&lt;/span&gt; myimage:arm64 &lt;span class="nt"&gt;--push&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Si no tienes un registro (registry), omite &lt;code&gt;--push&lt;/code&gt; y usa &lt;code&gt;--load&lt;/code&gt; para cargar localmente:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;docker buildx build &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/arm/v7 &lt;span class="nt"&gt;-t&lt;/span&gt; myimage:armv7 &lt;span class="nt"&gt;--load&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Opción B: Usa una imagen base compatible
&lt;/h4&gt;

&lt;p&gt;Asegúrate de que tu &lt;code&gt;Dockerfile&lt;/code&gt; use una imagen base ARM-compatible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# ❌ Incorrecto (x86)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; ubuntu:22.04&lt;/span&gt;

&lt;span class="c"&gt;# ✅ Correcto para Raspberry Pi 3/4 32-bit&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; arm32v7/ubuntu:22.04&lt;/span&gt;

&lt;span class="c"&gt;# ✅ Correcto para Raspberry Pi 4/5 64-bit&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; arm64v8/ubuntu:22.04&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Ejecuta sin &lt;code&gt;-d&lt;/code&gt; para depurar
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-t&lt;/span&gt; myimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Si falla, verás el mensaje de error en consola.&lt;/li&gt;
&lt;li&gt;Si funciona, el problema es que el proceso termina inmediatamente (ej. no hay servicio en segundo plano).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Verifica logs si el contenedor se crea
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-d&lt;/span&gt; myimage
docker ps &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; | xargs docker logs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Bloque de código corregido
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Verifica arquitectura&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker info | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"Architecture"&lt;/span&gt;

&lt;span class="c"&gt;# 2. Si la imagen no es ARM, reconstruye (ejemplo para Raspberry Pi 4 64-bit)&lt;/span&gt;
docker buildx build &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/arm64 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; myimage:arm64 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--load&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# 3. Ejecuta la versión corregida&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; myimage:arm64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Pro-tip: Evita este problema desde el inicio
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Siempre especifica &lt;code&gt;--platform&lt;/code&gt; al construir imágenes para Raspberry Pi&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  docker build &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/arm/v7 &lt;span class="nt"&gt;-t&lt;/span&gt; myimage &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Usa &lt;code&gt;docker manifest&lt;/code&gt; para verificar compatibilidad&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  docker manifest inspect ubuntu:22.04 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-A1&lt;/span&gt; &lt;span class="s1"&gt;'"platform"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Para Raspberry Pi 3/4 32-bit, usa &lt;code&gt;linux/arm/v7&lt;/code&gt;; para Pi 4/5 64-bit, usa &lt;code&gt;linux/arm64&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🔍 &lt;strong&gt;Nota crítica&lt;/strong&gt;: El error &lt;code&gt;--net = host&lt;/code&gt; (con espacios) en tu comando original es inválido. Docker lo ignora y lo interpreta como &lt;code&gt;--net=host&lt;/code&gt;, pero en versiones antiguas de Docker en Raspberry Pi esto puede causar fallos. Usa siempre &lt;code&gt;--net=host&lt;/code&gt; &lt;strong&gt;sin espacios&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🚀 ¿Quieres más soluciones técnicas?
&lt;/h3&gt;

&lt;p&gt;Si te sirvió esta ayuda, suscríbete para recibir los errores más comunes de la semana y cómo evitarlos.&lt;br&gt;
👉 &lt;a href="https://dev.to/erickeduardoramos03"&gt;Suscríbete aquí&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>iot</category>
      <category>spanish</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cómo solucionar el error de permisos al ejecutar `pip.exe` en un entorno virtual de Python en Windows</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Fri, 22 May 2026 05:59:08 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-el-error-de-permisos-al-ejecutar-pipexe-en-un-entorno-virtual-de-python-en-310e</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-el-error-de-permisos-al-ejecutar-pipexe-en-un-entorno-virtual-de-python-en-310e</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar el error de permisos al ejecutar &lt;code&gt;pip.exe&lt;/code&gt; en un entorno virtual de Python en Windows
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Explicación técnica
&lt;/h2&gt;

&lt;p&gt;El problema ocurre porque el archivo &lt;code&gt;pip.exe&lt;/code&gt; en la carpeta &lt;code&gt;Scripts/&lt;/code&gt; de tu entorno virtual es un &lt;strong&gt;launcher empaquetado&lt;/strong&gt; (un archivo &lt;code&gt;.exe&lt;/code&gt; que contiene una copia embebida de &lt;code&gt;python.exe&lt;/code&gt; y el script &lt;code&gt;__main__.py&lt;/code&gt; de pip). Este launcher tiene una ruta fija a &lt;code&gt;python.exe&lt;/code&gt; incrustada en su interior. Si esa ruta se vuelve inválida —por ejemplo, porque:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se instaló/desinstaló Python (especialmente desde Microsoft Store),&lt;/li&gt;
&lt;li&gt;Se movió o eliminó el Python original,&lt;/li&gt;
&lt;li&gt;Hubo corrupción durante la creación del entorno virtual,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…entonces el launcher falla con un error de &lt;strong&gt;"Access is denied"&lt;/strong&gt; o &lt;strong&gt;"Permission denied"&lt;/strong&gt;, aunque los permisos del archivo sean correctos. Esto es &lt;em&gt;falsamente&lt;/em&gt; percibido como un problema de permisos, pero en realidad es una &lt;strong&gt;corrupción del launcher&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;El hecho de que &lt;code&gt;python -m pip&lt;/code&gt; funcione confirma que el problema está &lt;em&gt;solo&lt;/em&gt; en el launcher &lt;code&gt;pip.exe&lt;/code&gt;, no en pip como paquete ni en el entorno virtual.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pasos para solucionarlo (definitivo)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Paso 1: Elimina el launcher corrupto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# En PowerShell o CMD (NO en bash, para evitar problemas de rutas con comillas)&lt;/span&gt;
del &lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\U&lt;/span&gt;&lt;span class="s2"&gt;sers&lt;/span&gt;&lt;span class="se"&gt;\&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;tu-usuario&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\r&lt;/span&gt;&lt;span class="s2"&gt;uta&lt;/span&gt;&lt;span class="se"&gt;\a&lt;/span&gt;&lt;span class="s2"&gt;l&lt;/span&gt;&lt;span class="se"&gt;\p&lt;/span&gt;&lt;span class="s2"&gt;royecto&lt;/span&gt;&lt;span class="se"&gt;\v&lt;/span&gt;&lt;span class="s2"&gt;env&lt;/span&gt;&lt;span class="se"&gt;\S&lt;/span&gt;&lt;span class="s2"&gt;cripts&lt;/span&gt;&lt;span class="se"&gt;\p&lt;/span&gt;&lt;span class="s2"&gt;ip.exe"&lt;/span&gt;
del &lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\U&lt;/span&gt;&lt;span class="s2"&gt;sers&lt;/span&gt;&lt;span class="se"&gt;\&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;tu-usuario&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\r&lt;/span&gt;&lt;span class="s2"&gt;uta&lt;/span&gt;&lt;span class="se"&gt;\a&lt;/span&gt;&lt;span class="s2"&gt;l&lt;/span&gt;&lt;span class="se"&gt;\p&lt;/span&gt;&lt;span class="s2"&gt;royecto&lt;/span&gt;&lt;span class="se"&gt;\v&lt;/span&gt;&lt;span class="s2"&gt;env&lt;/span&gt;&lt;span class="se"&gt;\S&lt;/span&gt;&lt;span class="s2"&gt;cripts&lt;/span&gt;&lt;span class="se"&gt;\p&lt;/span&gt;&lt;span class="s2"&gt;ip3.exe"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Importante&lt;/strong&gt;: No elimines &lt;code&gt;python.exe&lt;/code&gt;, solo los archivos &lt;code&gt;pip*.exe&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ✅ Paso 2: Regenera los launchers correctamente
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Asegúrate de que el entorno virtual esté activado&lt;/span&gt;
venv&lt;span class="se"&gt;\S&lt;/span&gt;cripts&lt;span class="se"&gt;\a&lt;/span&gt;ctivate

&lt;span class="c"&gt;# O ejecuta directamente (recomendado para evitar dependencias de PATH):&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; pip &lt;span class="nt"&gt;--force-reinstall&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto reinstala pip &lt;em&gt;desde cero&lt;/em&gt; y regenera los launchers &lt;code&gt;pip.exe&lt;/code&gt; y &lt;code&gt;pip3.exe&lt;/code&gt; con la ruta correcta a &lt;code&gt;python.exe&lt;/code&gt; del entorno.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔍 ¿Por qué funciona?&lt;br&gt;&lt;br&gt;
&lt;code&gt;pip install --force-reinstall&lt;/code&gt; detecta que los launchers faltan y los reconstruye usando la versión de &lt;code&gt;python.exe&lt;/code&gt; que está en &lt;code&gt;venv\Scripts\&lt;/code&gt;, no la del sistema.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ✅ Paso 3: Verifica que funcione
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# Debe mostrar algo como: pip 24.0 from ...\venv\lib\site-packages\pip (python 3.10)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Bloque de código corregido (script de reinstalación automática)
&lt;/h2&gt;

&lt;p&gt;Crea un archivo &lt;code&gt;fix-venv-pip.bat&lt;/code&gt; en la raíz de tu proyecto y ejecútalo como administrador (solo para permisos, no por seguridad):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;@echo &lt;span class="na"&gt;off&lt;/span&gt;
&lt;span class="nb"&gt;setlocal&lt;/span&gt;

&lt;span class="c"&gt;:: Configura la ruta a tu entorno virtual&lt;/span&gt;
&lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="s2"&gt;"VENV_DIR=&lt;/span&gt;&lt;span class="vm"&gt;%~dp0&lt;/span&gt;&lt;span class="s2"&gt;venv"&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;exist&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;%VENV_DIR%&lt;/span&gt;&lt;span class="s2"&gt;\Scripts\python.exe"&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kd"&gt;ERROR&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="kd"&gt;No&lt;/span&gt; &lt;span class="kd"&gt;se&lt;/span&gt; &lt;span class="kd"&gt;encontr&lt;/span&gt;ó &lt;span class="kd"&gt;python&lt;/span&gt;&lt;span class="err"&gt;.exe&lt;/span&gt; &lt;span class="kd"&gt;en&lt;/span&gt; &lt;span class="kd"&gt;el&lt;/span&gt; &lt;span class="kd"&gt;entorno&lt;/span&gt; &lt;span class="kd"&gt;virtual&lt;/span&gt;.
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="kd"&gt;Aseg&lt;/span&gt;úrate &lt;span class="kd"&gt;de&lt;/span&gt; &lt;span class="kd"&gt;que&lt;/span&gt; &lt;span class="kd"&gt;el&lt;/span&gt; &lt;span class="kd"&gt;entorno&lt;/span&gt; &lt;span class="kd"&gt;exista&lt;/span&gt; &lt;span class="kd"&gt;y&lt;/span&gt; &lt;span class="kd"&gt;est&lt;/span&gt;é &lt;span class="kd"&gt;creado&lt;/span&gt; &lt;span class="kr"&gt;con&lt;/span&gt; &lt;span class="s1"&gt;'python -m venv venv'&lt;/span&gt;.
    &lt;span class="k"&gt;exit&lt;/span&gt; &lt;span class="na"&gt;/b &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kd"&gt;INFO&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="kd"&gt;Eliminando&lt;/span&gt; &lt;span class="kd"&gt;launchers&lt;/span&gt; &lt;span class="kd"&gt;corruptos&lt;/span&gt;...
&lt;span class="nb"&gt;del&lt;/span&gt; &lt;span class="na"&gt;/q &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;%VENV_DIR%&lt;/span&gt;&lt;span class="s2"&gt;\Scripts\pip.exe"&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kr"&gt;nul&lt;/span&gt;
&lt;span class="nb"&gt;del&lt;/span&gt; &lt;span class="na"&gt;/q &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;%VENV_DIR%&lt;/span&gt;&lt;span class="s2"&gt;\Scripts\pip3.exe"&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kr"&gt;nul&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kd"&gt;INFO&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="kd"&gt;Reiniciando&lt;/span&gt; &lt;span class="kd"&gt;pip&lt;/span&gt; &lt;span class="kr"&gt;con&lt;/span&gt; &lt;span class="kd"&gt;launchers&lt;/span&gt; &lt;span class="kd"&gt;nuevos&lt;/span&gt;...
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;%VENV_DIR%&lt;/span&gt;&lt;span class="s2"&gt;\Scripts\python.exe"&lt;/span&gt; &lt;span class="na"&gt;-m &lt;/span&gt;&lt;span class="kd"&gt;pip&lt;/span&gt; &lt;span class="kd"&gt;install&lt;/span&gt; &lt;span class="na"&gt;--upgrade &lt;/span&gt;&lt;span class="kd"&gt;pip&lt;/span&gt; &lt;span class="na"&gt;--force-reinstall --no-cache-dir

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kd"&gt;SUCCESS&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; ¡Listo&lt;span class="err"&gt;!&lt;/span&gt; &lt;span class="kd"&gt;Ahora&lt;/span&gt; &lt;span class="kd"&gt;puedes&lt;/span&gt; &lt;span class="kd"&gt;usar&lt;/span&gt; &lt;span class="s1"&gt;'pip'&lt;/span&gt; &lt;span class="kd"&gt;dentro&lt;/span&gt; &lt;span class="nb"&gt;del&lt;/span&gt; &lt;span class="kd"&gt;entorno&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;Uso&lt;/strong&gt;: Ejecuta &lt;code&gt;fix-venv-pip.bat&lt;/code&gt; desde PowerShell/CMD en la carpeta del proyecto.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Pro-tip: Evita este problema en el futuro
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Nunca uses &lt;code&gt;pip.exe&lt;/code&gt; directamente si puedes evitarlo&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Usa siempre &lt;code&gt;python -m pip&lt;/code&gt; en entornos virtuales. Es más robusto y evita problemas con launchers corruptos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Evita mezclar instaladores de Python (web + Microsoft Store)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
La Microsoft Store instala Python en modo &lt;em&gt;silo&lt;/em&gt;, con rutas aisladas (&lt;code&gt;C:\Users\...\AppData\Local\Microsoft\WindowsApps\python.exe&lt;/code&gt;) que &lt;em&gt;parecen&lt;/em&gt; ser &lt;code&gt;python.exe&lt;/code&gt;, pero son &lt;em&gt;alias&lt;/em&gt; que fallan al ser embebidos en launchers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Si usas múltiples versiones de Python, crea entornos con la versión exacta deseada&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;ython310&lt;/span&gt;&lt;span class="se"&gt;\p&lt;/span&gt;&lt;span class="s2"&gt;ython.exe"&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Actualiza pip &lt;em&gt;antes&lt;/em&gt; de instalar paquetes&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; pip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;✅ &lt;strong&gt;Resultado esperado&lt;/strong&gt;: &lt;code&gt;pip install -e .&lt;/code&gt; funcionará sin errores de permisos, y el launcher se regenerará correctamente con la ruta interna a &lt;code&gt;python.exe&lt;/code&gt; válida.&lt;/p&gt;




&lt;h3&gt;
  
  
  🚀 ¿Quieres más soluciones técnicas?
&lt;/h3&gt;

&lt;p&gt;Si te sirvió esta ayuda, suscríbete para recibir los errores más comunes de la semana y cómo evitarlos.&lt;br&gt;
👉 &lt;a href="https://forms.gle/fJWehrdBTsYfiocw7" rel="noopener noreferrer"&gt;Suscríbete aquí&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>python</category>
      <category>spanish</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
