Pip: actualizaciones de pip in situ de windows

Creado en 5 nov. 2013  ·  89Comentarios  ·  Fuente: pypa/pip

no estoy seguro del estado de pip install --ugrade pip en Windows.

Necesito esto para PEP453

@pfmoore ?

vea el n. ° 188 para una vieja discusión sobre esto.

windows auto-locked bug

Comentario más útil

En Windows, use las ventanas del símbolo del sistema en modo Administrador. Luego escribe comando
python -m pip install - actualizar pip

Espero que te funcione. Así es como lo hice funcionar en Windows 10

Buena suerte.

Todos 89 comentarios

Utilice python -m pip install --upgrade pip . Creo que @vsajip estaba considerando alguna forma de magia en los envoltorios exe para significar que el auto-reemplazo del exe podría funcionar. Pero no sé si hizo algo en la versión de distlib que estamos usando. En realidad, no estoy seguro de que sea algo que _ podría_ hacerse sin la ayuda de la aplicación (pip). Y estoy bastante seguro de que no se ha agregado ningún código a pip para esto.

Personalmente, considero que esto es un problema menor: decirle a la gente que use `python -m pip`` me parece una respuesta perfectamente aceptable, dado que el problema es fundamental para cómo Windows maneja la eliminación de archivos abiertos.

En última instancia, será una cuestión de cuánta complejidad (con el consiguiente coste de mantenimiento) y riesgo queremos asumir para solucionar este problema.

Personalmente, estoy de acuerdo con que pip install --upgrade pip imprima un mensaje para usar python -m pip install --upgrade pip . Simplemente no creo que debamos lanzar un error sobre los identificadores de archivos abiertos o cualquiera que sea la excepción.

Estaba a punto de decir lo mismo.

Aquí hay una pregunta: ¿le gustaría que ese mensaje solo apareciera en Windows o sería razonable decir lo mismo en Unix (para una experiencia de usuario consistente)? Personalmente, me gustaría ser coherente en todas las plataformas (porque es más fácil documentar de esa manera).

Además, deberíamos capturar cualquier comando que intente (re) instalar pip - pip install -I pip es otro, por ejemplo.

Personalmente, creo que debería ser solo Windows. Lo veo como una solución para la forma en que funciona la plataforma de Windows, y algo que es un objetivo que eventualmente eliminará para algo mejor en el futuro.

Sabía que ibas a decir eso :-(

Francamente, no creo que alguna vez obtengamos "algo mejor", básicamente porque no tenemos suficiente experiencia en Windows para desarrollarlo y mantenerlo. Sé de _no_ software de Windows con una solución satisfactoria de auto-reemplazo de ejecutables. Ciertamente no tengo una respuesta, y no esperaría que ninguno de los desarrolladores basados ​​en Unix pudiera ayudar. Incluso si obtuviéramos algo, es probable que sea complejo y, por lo tanto, una fuente probable de descomposición de bits y errores oscuros.

Hacer una solución que funcione en todas las plataformas me parece que la "respuesta oficial" evita enviar mensajes confusos al usuario. Realice una copia de seguridad con una advertencia como se describe y tendremos una solución sólida, incluso si no es tan perfecta como hacer que pip install -U pip funcione.

Por favor, disculpe un cierto nivel de mal humor en esta respuesta, causado por la sensación de que siempre es la plataforma Windows la que tiene que comprometerse; no quiero convertir esto en un problema. En la práctica, seguiré el consenso que sea. No creo que sea gran cosa.

FWIW, mi objetivo después de que PEP453 esté listo es poner en funcionamiento nuestra propia infraestructura de prueba que incluye Windows, así que espero que eso resuelva algunos de los problemas de bitrot de Windows.

Sin embargo, puedo entender el mal humor :) Si estuviéramos diseñando este sistema completamente nuevo, sería mucho más adaptable a eso, pero no creo que sea fácil de usar romper pip install -U pip para todo lo que no sea Windows para mantener la consistencia. Si esto fue algo nuevo, entonces no hay (o al menos menos) expectativas del usuario:]

OK, eso suena justo. Tienes razón en que el uso histórico es más importante aquí.

De hecho, no tengo la menor idea de cuál es la experiencia del usuario en Unix, por lo que probablemente soy tan culpable de pensar unilateralmente como cualquier otra persona. Debo intentar ver cómo se siente el uso de Python en Linux: ¿hay un buen recurso de "Python en Linux para principiantes" que muestre cómo configurar un entorno Python (3), configurar las diversas herramientas, etc.? [Una cosa que siempre encuentro que no se cubre, es cómo hacer que "python" ejecute Python 3 por defecto, cómo hacer que "virtualenv" compile Python 3 virtualenvs por defecto, todo ese tipo de cosas - me parece que Python 3 es mucho más de segunda clase en Unix que en Windows, por extraño que parezca.]

Por lo general, no desea hacer que python apunte a python3 en * nix porque el sistema usa Python y no todas sus bibliotecas se migrarán a Python3. Sin embargo, hay algunas distribuciones de Linux que tienen Python3 como predeterminado ahora ... creo que Arch? ¿Y quizás el próximo Fedora?

Hmm, no estoy hablando a nivel de sistema, pero ¿realmente no puedes elegir qué usar para Python en tu cuenta personal? Eso definitivamente hace que Python 3 sea de segunda clase, en mi opinión ... Pero explica por qué los usuarios de Unix no parecen encontrar el uso de cosas como "pip3" o "pip3.3" tan feo como el pecado :-)

(De todos modos, estamos muy fuera del tema aquí, así que no importa).

Puede configurar su shell para que tenga ~ / bin / antes del bin del sistema y agregar un enlace simbólico allí de python a python3, pero sí, offtopic. Sin embargo, me complace ayudarlo si realmente está interesado en configurar las cosas:] IRC o correo electrónico.

Mi trabajo al que creo que Paul se refería era solo implementar el baile 'deleteme' para reemplazar archivos en uso (es decir, envoltorios exe), eso está en el código distlib Python, no en los envoltorios .exe. Esto está en el módulo distlib.scripts y debe ejercerse siempre que ese módulo se utilice para crear un script.

Entonces, ¿quizás esto ya esté resuelto para Wheels? ¿Y es un problema de setuptools si no?

Suena posible. Hoy haré algunas pruebas, si puedo.

Lamentablemente no, al menos con "pip install -I pip". (Es difícil probar una actualización real, ya que solo la última versión absoluta de pip tiene soporte para envoltorios de scripts):

>pip install -f $x -I pip --use-wheel --no-index --pre
Ignoring indexes: https://pypi.python.org/simple/
Downloading/unpacking pip
Installing collected packages: pip
  Found existing installation: pip 1.5.dev1
    Uninstalling pip:
      Successfully uninstalled pip
Cleaning up...
Exception:
Traceback (most recent call last):
  File "C:\Work\Scratch\xxyy\lib\shutil.py", line 365, in _rmtree_unsafe
    os.unlink(fullname)
PermissionError: [WinError 5] Access is denied: 'c:\\users\\uk03306\\appdata\\local\\temp\\pip-zhbsiy-uninstall\\work\\scratch\\xxyy\\scripts\\pip.exe'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Work\Scratch\xxyy\lib\site-packages\pip\basecommand.py", line 121, in main
    status = self.run(options, args)
  File "C:\Work\Scratch\xxyy\lib\site-packages\pip\commands\install.py", line 258, in run
    requirement_set.install(install_options, global_options, root=options.root_path)
  File "C:\Work\Scratch\xxyy\lib\site-packages\pip\req.py", line 1330, in install
    requirement.commit_uninstall()
  File "C:\Work\Scratch\xxyy\lib\site-packages\pip\req.py", line 557, in commit_uninstall
    self.uninstalled.commit()
  File "C:\Work\Scratch\xxyy\lib\site-packages\pip\req.py", line 1743, in commit
    rmtree(self.save_dir)
  File "C:\Work\Scratch\xxyy\lib\site-packages\pip\util.py", line 42, in rmtree
    onerror=rmtree_errorhandler)
  File "C:\Work\Scratch\xxyy\lib\shutil.py", line 460, in rmtree
    return _rmtree_unsafe(path, onerror)
  File "C:\Work\Scratch\xxyy\lib\shutil.py", line 362, in _rmtree_unsafe
    _rmtree_unsafe(fullname, onerror)
  File "C:\Work\Scratch\xxyy\lib\shutil.py", line 362, in _rmtree_unsafe
    _rmtree_unsafe(fullname, onerror)
  File "C:\Work\Scratch\xxyy\lib\shutil.py", line 362, in _rmtree_unsafe
    _rmtree_unsafe(fullname, onerror)
  File "C:\Work\Scratch\xxyy\lib\shutil.py", line 362, in _rmtree_unsafe
    _rmtree_unsafe(fullname, onerror)
  File "C:\Work\Scratch\xxyy\lib\shutil.py", line 367, in _rmtree_unsafe
    onerror(os.unlink, fullname, sys.exc_info())
  File "C:\Work\Scratch\xxyy\lib\site-packages\pip\util.py", line 61, in rmtree_errorhandler
    func(path)
PermissionError: [WinError 5] Access is denied: 'c:\\users\\uk03306\\appdata\\local\\temp\\pip-zhbsiy-uninstall\\work\\scratch\\xxyy\\scripts\\pip.exe'

Storing complete log in C:\Users\uk03306\pip\pip.log

Entonces pip no usa distlib.scripts para instalar scripts ... supongo que no encaja en el flujo pip trabajo

Sospecho que es porque hacemos una desinstalación y luego una instalación, en lugar de una instalación sobrescribiendo lo que está allí (por razones obvias).

Windows no permite sobrescribir o eliminar archivos exe abiertos, pero sí permite cambiarles el nombre o moverlos.

Bueno, con algunas tonterías con la API de Win32, puede cerrar el controlador a pip.exe como puede hacerlo cuando usa el explorador de procesos de Sysinternal.

No creo que pueda cerrar todos los controladores del exe que se está ejecutando actualmente. Pero si tiene un código que funciona como ejemplo, me encantaría verlo, ya que durante mucho tiempo ha sido un problema que la gente ha debatido y el consenso siempre ha sido que no es posible (excepto con trucos como "cambiar el nombre y eliminar más tarde" ). Un código de trabajo que haga esto sería extremadamente útil para la comunidad.

Se encuentra con el mismo problema.

Como truco rápido, ¿puede pip.exe detectar que se está actualizando antes de la ejecución y reiniciarse con python -m pip {{ sys.argv }} ?

No creo que eso realmente funcione.

Pero tal vez un pensamiento estúpido, afaik el .exe no necesita ser actualizado, ¿podemos simplemente pip.exe en un caso especial y dejarlo solo? Sin embargo, posiblemente dejaría un pip.exe por ahí después de una instalación.

@dstufft correcto, "reiniciarse a sí mismo" no es tan simple como @techtonik lo hace sonar en Windows, donde no hay equivalente a la llamada de Unix exec .

Técnicamente, pip.exe puede necesitar una actualización si cambia el punto de entrada o si se cambia el código contenedor de distlib. Eso no es común, pero puede suceder (al principio, el código distlib cambió un poco hasta que las cosas se calmaron). Lo que sería posible hacer sería escribir el nuevo pip.exe en una ubicación temporal, luego, si es idéntico al actual, omítalo. No evitaría errores cuando necesitara actualizarse, pero en el 99% de los casos en los que no lo hizo, estaría bien.

Por cierto, estamos dando vueltas aquí. De acuerdo con los comentarios anteriores de Vinay, esto se resuelve en distlib (que es donde creo que debería resolverse), pero pip no usa la API de una manera que le permita funcionar. Si pudiéramos usar la solución distlib, entonces genial. De lo contrario, necesitamos que alguien escriba una solución específica para pip (y sigo siendo escéptico de que esto se pueda hacer de una manera sólida y mantenible que no sea mucho más compleja de lo que justifica el problema).

Sugerencia:

  1. Alguien agregue una sección a los documentos de pip en http://www.pip-installer.org/en/latest/installing.html#install-or-upgrade-pip notando que se necesita la solución alternativa python -m pip en Windows al actualizar pip consigo mismo. Podría tener la oportunidad de hacer esto en algún momento, pero las relaciones públicas de las personas que han contribuido a este problema serían aceptadas con gratitud :-).
  2. Si alguien tiene una solución viable y está preparado para implementarla, debería plantear un PR y podemos revisar el código real en lugar de los enfoques propuestos.

Creo que estamos en una etapa en la que el código de trabajo real es lo único que hará avanzar este problema.

Soy -1 en inflar los documentos sin probar otras soluciones.

Soy +1 en documentar lo que funciona en este momento.

Incluso con el comentario del documento, sigue siendo una solución alternativa, no una solución, y tiene el símbolo del sistema de Windows incorrecto.

Tal vez esto sea una locura, pero siempre hago esto:

$ curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python

por supuesto, esto requiere que uno tenga libcurl, pero hay binarios de Windows disponibles aquí .

Intenté instalarlo en una Mac pero recibí este

Alexs-MacBook- Air: Pipmodules ale y $ pip install -U pip
-bash: pip: comando no encontrado
Alexs-MacBook- Air: Pipmodules ale y $ python get-pip.py
Descargando / desempaquetando pip
Descargando pip-1.5.5-py2.py3-none-any.whl (1.2MB): 1.2MB descargados
Instalación de paquetes recopilados: pip
Limpiar...
Excepción:
Rastreo (llamadas recientes más última):
Archivo "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/basecommand.py", línea 122, en main
status = self.run (opciones, argumentos)
Archivo "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/commands/install.py", línea 283, en ejecución
requisito_set.install (install_options, global_options, root = options.root_path)
Archivo "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/req.py", línea 1435, en instalación
requisito.install (opciones_instalación, opciones_globales, _args, * _kwargs)
Archivo "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/req.py", línea 671, en instalación
self.move_wheel_files (self.source_dir, root = root)
Archivo "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/req.py", línea 901, en move_wheel_files
pycompile = self.pycompile,
Archivo "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/wheel.py", línea 215, en move_wheel_files
clobber (fuente, lib_dir, True)
Archivo "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/wheel.py", línea 205, en clobber
os.makedirs (destdir)
Archivo "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py", línea 157, en makedirs
mkdir (nombre, modo)
OSError: [Errno 13] Permiso denegado: '/Library/Python/2.7/site-packages/pip'

Almacenamiento del registro de depuración por fallas en /Users/aleand/Library/Logs/pip.log

@zaducu , puedo decir por su rastreo que está tratando de actualizar la versión pip que está en la versión de Python que vino preinstalada con su mac. Dado que está actualizando la versión preinstalada, deberá elevar sus credenciales usando sudo :

$ sudo curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python

Para usar sudo es posible que deba agregarse a /etc/sudousers . Búscalo en Google y encontrarás numerosos enlaces que muestran cómo hacer esto.

Mac es inteligente, mantiene sus paquetes en /Library/Python lugar de corromper su carpeta /System/Frameworks/Python.framework site-pacakges . ¡Hurra! Pero para acceder a esta carpeta debe ser un administrador con privilegios de root, por lo tanto sudo .

Una alternativa a considerar es mantener sus paquetes y módulos personales separados usando virtualenv y / o una carpeta .local . Para instalar paquetes en una carpeta local, use distutils lugar de pip y siga las instrucciones sobre la instalación de módulos de Python .

Otras alternativas al uso de Python preinstalado son usar Python oficial , homebrew , MacPorts, Fink o construirlo usted mismo.

Para Python oficial, todavía necesitará sudo pero instalará la mayoría de los elementos en /System/Frameworks no /System/Library/Frameworks Para Homebrew, no debería necesitar sudo . No puedo hablar por MacPorts o Fink.

Todavía tengo el mismo problema en Windows, actualizando de 1.5.4 a 6.0.8:

E: \ Distrib \ Programming> pip install -U pip
Descargando / desempaquetando pip de https://pypi.python.org/packages/py2.py3/p/pip/pip-6.0.8-py2.py3-none-any.whl#md5 = 41e73fae2c86ba2270ff51c1d86
f7e09
Instalación de paquetes recopilados: pip
Instalación existente encontrada: pip 1.5.4
Desinstalar pip:
Pip desinstalado con éxito
Limpiar...
Excepción:
Rastreo (llamadas recientes más última):
Archivo "C: \ Python \ 3.3-32 \ lib \ shutil.py", línea 371, en _rmtree_unsafe
os.unlink (nombre completo)
PermissionError: [WinError 5] Отказано в доступе: 'c: \ users \ bialix \ appdata \ local \ temppip-6i_i7a-uninstallpython \ 3.3-32 \ scripts \ p
ip.exe '

Durante el manejo de la excepción anterior, se produjo otra excepción:

Rastreo (llamadas recientes más última):
Archivo "C: \ Python \ 3.3-32 \ lib \ site-packagespip \ basecommand.py", línea 122, en main
write_debug_log = check_path_owner (debug_log_path)
Archivo "C: \ Python \ 3.3-32 \ lib \ site-packagespip \ commands \ install.py", línea 283, en ejecución
build_delete = (no (options.no_clean u options.build_dir))
Archivo "C: \ Python \ 3.3-32 \ lib \ site-packagespipreq.py", línea 1443, en instalación
Archivo "C: \ Python \ 3.3-32 \ lib \ site-packagespipreq.py", línea 610, en commit_uninstall
Archivo "C: \ Python \ 3.3-32 \ lib \ site-packagespipreq.py", línea 1860, en confirmación
Archivo "C: \ Python \ 3.3-32 \ lib \ site-packagespip \ util.py", línea 43, en rmtree
Archivo "C: \ Python \ 3.3-32 \ lib \ shutil.py", línea 478, en rmtree
return _rmtree_unsafe (ruta, un error)
Archivo "C: \ Python \ 3.3-32 \ lib \ shutil.py", línea 368, en _rmtree_unsafe
_rmtree_unsafe (nombre completo, un error)
Archivo "C: \ Python \ 3.3-32 \ lib \ shutil.py", línea 368, en _rmtree_unsafe
_rmtree_unsafe (nombre completo, un error)
Archivo "C: \ Python \ 3.3-32 \ lib \ shutil.py", línea 368, en _rmtree_unsafe
_rmtree_unsafe (nombre completo, un error)
Archivo "C: \ Python \ 3.3-32 \ lib \ shutil.py", línea 373, en _rmtree_unsafe
onerror (os.unlink, nombre completo, sys.exc_info ())
Archivo "C: \ Python \ 3.3-32 \ lib \ site-packagespip \ util.py", línea 62, en rmtree_errorhandler
PermissionError: [WinError 5] Отказано в доступе: 'c: \ users \ bialix \ appdata \ local \ temppip-6i_i7a-uninstallpython \ 3.3-32 \ scripts \ p
ip.exe '

¿Algún cambio en este tema?

No se puede arreglar en ningún sentido práctico (al menos, alguien necesitaría proporcionar un parche completo y funcional para la evaluación si pensara que lo era, ya que nadie ha descubierto todavía una manera de solucionarlo, es esencialmente una limitación de Windows).

La forma correcta de actualizar pip en Windows es python -m pip install -U pip .

@pfmoore ¿Qué pasa con Python 2.6?

[py26] C:\Users\IEUser>python -m pip --version
C:\Users\IEUser\Anaconda\envs\py26\python.exe: pip is a package and cannot be directly executed

@dalcinl Suspiro. Odio tener que pensar en Python 2.6 :-)

Si mal no recuerdo, python -m pip.__main__ trabaja allí. No tengo una copia de Python 2.6 a mano para probarlo en este momento, lo siento ...

Acabo de probar en Python 2.6, y python -m pip.__main__ sí funciona allí.

¡Hola!

python -m pip install -U pip no me funciona (w7, powershell, python instalado a través de chocolatey); la instalación falla con problemas de permisos:

PS C:\tools> python --version
Python 3.4.3
PS C:\tools> pip --version
pip 6.0.8 from C:\tools\python\lib\site-packages (python 3.4)
PS C:\tools> python -m pip install -U pip
You are using pip version 6.0.8, however version 7.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting pip from https://pypi.python.org/packages/py2.py3/p/pip/pip-7.0.1-py2.py3-none-any.whl#md5=9b403ba9b82d4a1e5fda5b6cc8952b57
  Using cached pip-7.0.1-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 6.0.8
    Uninstalling pip-6.0.8:
      Exception:
      Traceback (most recent call last):
        File "C:\tools\python\lib\shutil.py", line 523, in move
          os.rename(src, real_dst)
      PermissionError: [WinError 5] Access is denied: 'c:\\tools\\python\\lib\\site-packages\\pip-6.0.8.dist-info\\description.rst' -> 'C:\\Users\\Administrator\\AppData\\Local\\Temp\\pip-4ghq1oa9-uninstall\\tools\\python\\lib\\site-packages\\pip-6.0.8.dist-info\\description.rst'

      During handling of the above exception, another exception occurred:

      Traceback (most recent call last):
        File "C:\tools\python\lib\site-packages\pip\basecommand.py", line 232, in main
          status = self.run(options, args)
        File "C:\tools\python\lib\site-packages\pip\commands\install.py", line 347, in run
          root=options.root_path,
        File "C:\tools\python\lib\site-packages\pip\req\req_set.py", line 543, in install
          requirement.uninstall(auto_confirm=True)
        File "C:\tools\python\lib\site-packages\pip\req\req_install.py", line 667, in uninstall
          paths_to_remove.remove(auto_confirm)
        File "C:\tools\python\lib\site-packages\pip\req\req_uninstall.py", line 126, in remove
          renames(path, new_path)
        File "C:\tools\python\lib\site-packages\pip\utils\__init__.py", line 316, in renames
          shutil.move(old, new)
        File "C:\tools\python\lib\shutil.py", line 536, in move
          os.unlink(src)
      PermissionError: [WinError 5] Access is denied: 'c:\\tools\\python\\lib\\site-packages\\pip-6.0.8.dist-info\\description.rst'

Pensamientos

No hay forma de que nadie tenga ese archivo bloqueado, o que usted no tenga permiso para eliminarlo. ¿Podría ser un problema de chocolate? ¿Puede eliminar ese archivo manualmente desde un símbolo del sistema?

@AmazingHorse has probado

curl -k https://bootstrap.pypa.io/get-pip.py | python

asumiendo que tienes cURL ?

Interesante, @pfmoore , ese archivo está bloqueado incluso en un símbolo del sistema de administrador.

Entonces, suena como un problema de permisos de Windows en lugar de algo con pip.

¿Tiene que ver con el hecho de que mi Python se instaló fuera de la estructura de directorios de Windows en C:?

Estaré buscando en Google, pero tengo curiosidad por saber si alguien puede publicar aquí por qué creen que podría ser causado.

Animo amigos

@AmazingHorse Honestamente, no tengo idea. La otra posibilidad es que puede ser que haya algo en particular acerca de cómo Chocolatey instala Python; tal vez informe el problema en su rastreador (¿supongo que tienen uno?) Y vea lo que dicen.

Pero sí, no es un problema de pip por el sonido.

Windows permite cambiar el nombre / mover archivos asignados en memoria (asignados como imagen o datos) a un nuevo nombre en el mismo volumen. Entonces, el controlador de errores rmtree puede intentar cambiar el nombre del archivo para moverlo al directorio temporal base. Al menos allí no interferirá con la eliminación del directorio. Esta solución alternativa falla si el archivo está en un volumen diferente al del directorio temporal, o por una infracción de uso compartido, o si la ACL del archivo impide la operación. Pero ninguno de esos debería aplicarse en este caso.

Si el grupo de administradores está habilitado en el token de proceso, el archivo renombrado se puede programar para su eliminación cuando el sistema se reinicia. Simplemente use ctypes para llamar a MoveFileExW(path, None, MOVEFILE_DELAY_UNTIL_REBOOT) . Sin embargo, esto falla para los usuarios habituales porque no se les permite modificar el valor de registro PendingFileRenameOperations del administrador de sesiones.

pip en Windows 7/10 funciona bien excepto para la actualización> pip install --upgrade pip
Intento cargar lo menos posible en mi C: \ (SSD) e instalar el software en el árbol comenzando en D: \ NUC \
Esto es lo que estoy viendo:

D:\NUC\Python34>pip install --upgrade pip
You are using pip version 6.0.8, however version 7.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting pip from https://pypi.python.org/packages/py2.py3/p/pip/pip-7.1.2-py2.py3-none-any.whl#md5=5ff9fec0be479e4e36df467556deed4d
  Downloading pip-7.1.2-py2.py3-none-any.whl (1.1MB)
    100% |################################| 1.1MB 204kB/s
Installing collected packages: pip
  Found existing installation: pip 6.0.8
    Uninstalling pip-6.0.8:
      Exception:
      Traceback (most recent call last):
        File "D:\NUC\Python34\lib\shutil.py", line 523, in move
          os.rename(src, real_dst)
      OSError: [WinError 17] The system cannot move the file to a different disk drive: 'd:\\nuc\\python34\\scripts\\pip.exe' -> 'C:\\Users\\David\\AppData\\Local\\Temp\\pip-247i52js-uninstall\\nuc\\python34\\scripts\\pip.exe'

      During handling of the above exception, another exception occurred:

      Traceback (most recent call last):
        File "D:\NUC\Python34\lib\site-packages\pip\basecommand.py", line 232, in main
        File "D:\NUC\Python34\lib\site-packages\pip\commands\install.py", line 347, in run
        File "D:\NUC\Python34\lib\site-packages\pip\req\req_set.py", line 543, in install
        File "D:\NUC\Python34\lib\site-packages\pip\req\req_install.py", line 667, in uninstall
        File "D:\NUC\Python34\lib\site-packages\pip\req\req_uninstall.py", line 126, in remove
        File "D:\NUC\Python34\lib\site-packages\pip\utils\__init__.py", line 316, in renames
        File "D:\NUC\Python34\lib\shutil.py", line 536, in move
          os.unlink(src)
      PermissionError: [WinError 5] Access is denied: 'd:\\nuc\\python34\\scripts\\pip.exe'

La ruta de la carpeta AppData está disponible en mi unidad D :, preguntándome cuál es la mejor manera de manejar esta situación para las herramientas y el uso posteriores. Pensé en un cruce, pero todavía parecerá un camino diferente. ¿Tal vez escriba las diferencias de la ubicación esperada a la ubicación real para verificar la ruta correcta? Antes de hacer esto, pip instaló bien django (pero se quejó de la versión que condujo a este descubrimiento). hmmm ... y ahora pip parece roto.

D:\NUC\Python34\Scripts>pip -h
Traceback (most recent call last):
  File "D:\NUC\Python34\lib\runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "D:\NUC\Python34\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "D:\NUC\Python34\Scripts\pip.exe\__main__.py", line 5, in <module>
ImportError: No module named 'pip'

D:\NUC\Python34\Scripts>dir
 Volume in drive D is TOSHIBA EXT
 Volume Serial Number is E085-D5D7

 Directory of D:\NUC\Python34\Scripts

08/25/2015  09:08 AM    <DIR>          .
08/25/2015  09:08 AM    <DIR>          ..
08/25/2015  09:08 AM            92,045 django-admin.exe
08/25/2015  09:08 AM               136 django-admin.py
08/25/2015  09:01 AM               346 easy_install-3.4-script.py
08/25/2015  09:01 AM            65,536 easy_install-3.4.exe
08/25/2015  09:01 AM               651 easy_install-3.4.exe.manifest
08/25/2015  09:01 AM               338 easy_install-script.py
08/25/2015  09:01 AM            65,536 easy_install.exe
08/25/2015  09:01 AM               647 easy_install.exe.manifest
08/25/2015  08:19 AM            91,984 pip.exe
08/25/2015  08:19 AM            91,984 pip3.4.exe
08/25/2015  08:19 AM            91,984 pip3.exe
08/25/2015  09:08 AM    <DIR>          __pycache__
              11 File(s)        501,187 bytes
               3 Dir(s)  328,895,152,128 bytes free

D:\NUC\Python34\Scripts>

tienes que hacer python.exe -m pip install --upgrade pip

En Python 2.6 necesitas ejecutar python -m pip.__main__ install -U pip

Considero que la situación actual es realmente mala para los nuevos usuarios de Python, así como para los antiguos usuarios de Python como yo, que normalmente no usan Windows. Sin embargo, estoy perfectamente bien usando python -m pip install --upgrade pip , pero realmente creo que pip install --upgrade pip debería recomendarlo automáticamente en Windows. @dstufft ya propuso esto en 2013. ¿Hay alguna buena razón para no hacerlo?

PD: Lo siento por informar # 3462 como un duplicado de este problema. No encontré este problema buscando en el rastreador WindowsError . Con suerte, después de este comentario, otros lo harán en el futuro.

Hasta donde yo sé, ya es el comando que pip sugiere al usuario cuando detecta una nueva versión de sí mismo. La situación no es tan mala.

@pekkaklarck La principal razón para no hacerlo es que es muy difícil de detectar. Para empezar, no sé cómo detectar de manera confiable que pip se está ejecutando desde pip.exe lugar de python -m pip . E incluso si detecta eso, debe verificar si pip está en las cosas que se están instalando (considere pip install --upgrade -r http://some.remote/requirements.txt ; para cuando haya leído el archivo de requisitos, posiblemente sea demasiado tarde para emitir el mensaje).

Por supuesto, algo que no es 100% perfecto es algo completamente razonable de implementar: asegurarse de no objetar usos completamente válidos, en lugar de asegurarnos de detectar todos los casos de esquina, eso es realmente importante.

Ciertamente consideraríamos fusionar un PR para abordar este problema, pero no creo que ninguno de los desarrolladores principales de pip encuentre el problema lo suficientemente problemático como para intentar solucionarlo ellos mismos (probablemente soy el usuario de Windows más pesado entre los desarrolladores principales, y Encuentro que recordar usar python -m pip razonablemente fácil).

para determinar si somos pip[.exe] o no, imagino

"pip" in os.path.basename(sys.argv[0])

funcionaría bien. Además, solo una advertencia de ver [-U|--upgrade] y pip en la invocación probablemente sería suficiente para corregir el 90% de las invocaciones.

@stonebig : ¿Podría aclarar cuándo se recomienda ese comando? Intenté pip install -U pip después de una nueva instalación de Python 2.7.11 y falló con este error:

WindowsError: [Error 5] Acceso denegado: 'c: \ users \ koulutus \ appdata \ local \ temppip-65z4kx-uninstallpython27 \ scriptspip.exe'

@pfmoore : La actualización de pip en el archivo de requisitos suena bastante rara y probablemente podría ignorarse. Como @Ivoz , pensé que pip.exe estaría en sys.argv . Alternativamente, debería ser posible atrapar el WindowsError y reaccionar a eso.

@Ivoz, ¿eso funciona? Pensé que el contenedor pip.exe invocaba a Python como un subproceso, por lo que no funcionaría. Pero una prueba rápida (imprimiendo sys.argv[0] en pip.main() ) muestra:

>py -m pip
C:\Users\Gustav\AppData\Local\Programs\Python\Python35\lib\site-packages\pip\__main__.py

Usage:
...

>pip
C:\Users\Gustav\AppData\Local\Programs\Python\Python35\Scripts\pip

Usage:
...

>pip.exe
C:\Users\Gustav\AppData\Local\Programs\Python\Python35\Scripts\pip

Usage:

Entonces funciona, pero debe tener cuidado de cómo detecta pip en sys.argv[0] (tenga en cuenta que el primer ejemplo incluye el directorio pip en la ruta de __main__.py )

Gracias por señalar esto. Aprendí algo hoy :-)

@pekkaklarck El problema con la captura del WindowsError (si mal no recuerdo) es que ocurre bastante tarde y la instalación es parcialmente completa (y no es fácil de revertir).

Pero no quiero disuadir a nadie de que intente solucionar este problema, así que lo dejaré así :-)

pero debes tener cuidado al detectar pip en sys.argv [0]

@pfmoore de ahí la llamada a os.path.basename .

@Ivoz Suspiro. Demasiado tarde por la noche aquí. Si obviamente :-)

@pekkaklarck . por ejemplo al hacer pip list (en Windows). Por lo que recuerdo en las discusiones del año pasado:

  • esta fue la única solución que el equipo de pypa imaginó como confiable,
  • solo se muestra en Windows.

pip_example

Podría haber una mejor solución, pero supongo que ya es el 80% de una respuesta perfecta de la situación anterior.

Quizás una mejor solución sería tener un "upgrade_pip.bat" entregado con la instalación de Windows por defecto de Python, no ajustado a "pip", y eso haría ese comando. (o pip_update.bat para que coincida mejor con conda?)

Hice esto hoy mientras me sumergía en la nueva experiencia de usuario de Windows Python. Fue terrible.
¿Podemos hacer que -m automático para ese comando? (¿quizás darle a la actualización de pip su propio comando?)

Ningún usuario debería tener que ver esto, especialmente después de ejecutar exactamente el comando _pip les dijo que ejecutaran_.

screen shot 2016-02-23 at 9 51 53 pm

Creo que ya tenemos la configuración de registro en versiones más recientes de pip que 7.0.1 para decirles a los usuarios de Windows que usen python -m pip install --upgrade pip lugar de pip install --upgrade pip .

: destellos:: pastel:: destellos:

Sí, desde 7.1 cf # 2830

\ O /

No puedo mejorar mi pip en win 10, ¿qué pasa?

default

@grasx
Si realmente quieres saber qué pasa, lee este hilo. Si solo está interesado en que esto funcione, lea la última línea del resultado que obtuvo y compárela con lo que ejecutó.

@ piotr-dobrogost
¿Lo es? La última línea roja parece apuntar a un problema de decodificación, más bien al error de acceso denegado que es el resultado habitual de una actualización en Windows. ¿ Podría el problema de

Dudo que el problema que haya encontrado

@nmusatti
Tienes razón. Culpa mía.

@ piotr-dobrogost @nmusatti @pekkaklarck Sin embargo, gracias, cambié el nombre de usuario, por lo que ahora solo contiene caracteres ASCII y pip actualizado con éxito a 8.1

@grasx cambió el nombre de usuario? Estoy confundido con lo que dijiste ... Tuve el mismo problema, algo diferente es que estaba en Windows 7

idea aleatoria, ¿qué tal no reemplazar el archivo exe si no es necesario?

por lo que tengo entendido, los archivos exe son trampolines muy pequeños que normalmente funcionan

la lógica más importante está en los archivos de script adjuntos

@ pzz2011 Bueno, en realidad reinstalé mi win y establecí un nuevo nombre de usuario. En mi caso fue más fácil que averiguar cómo cambiarlo en todos los lugares y rutas donde se menciona :)

@RonnyPfannschmidt Depende de lo que se use para escribir el .exe: las herramientas de configuración utilizadas para usar foo.exe + foo-script.py (no estoy seguro de lo que hace ahora), mientras que distlib (si está configurado así) crea un solo foo.exe que incorpora el script.

@grasx hhh ... Encontré una manera más fácil de resolverlo. Acabo de reinstalar Python de 2.7.xa 2.7.10.
Entonces el éxito me sonríe ~

En Windows, use las ventanas del símbolo del sistema en modo Administrador. Luego escribe comando
python -m pip install - actualizar pip

Espero que te funcione. Así es como lo hice funcionar en Windows 10

Buena suerte.

@grasx No estoy del todo seguro de por qué, pero ese error aparece al seleccionar "instalar para todos los usuarios" en el instalador de Python en Windows 8.1 y 10. Realice una reinstalación, seleccione PATH e instalación personalizada. Asegúrese de que la casilla superior no esté marcada y seleccione la ubicación de instalación. Usar "python -m pip install --upgrade pip" en cmd funciona bien después de eso.

Solo un FYI, para usuarios de Windows. Si instala Cygwin, Python2.7 se instala automáticamente. Todo lo que necesita hacer entonces es ejecutar:

wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py

(Sí, primero debe instalar wget ).

image
¿Cómo resolver este problema?

@ JingY0604
Consulte Para copiar texto desde una ventana del símbolo del sistema para obtener una explicación sobre cómo copiar texto aquí. De esta forma, se podrá buscar el texto que publiques.

Está utilizando pip versión 7.1.0, sin embargo, la versión 9.0.1 está disponible.
Debería considerar la actualización a través del comando 'python -m pip install --upgrade pip'
y.
D: \ Archivos de programa \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_vendorrequ
ests \ packages \ urllib3 \ util \ ssl_.py: 90: InsecurePlatformWarning: Un verdadero SSLContex
t objeto no está disponible. Esto evita que urllib3 configure SSL apropiadamente
Ely y puede hacer que algunas conexiones SSL fallen. Para obtener más información, consulte http
ps: //urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
InseguroPlataformaAdvertencia
Recogiendo pip
Descargando pip-9.0.1-py2.py3-none-any.whl (1.3MB)
Excepción:
Rastreo (llamadas recientes más última):
Archivo "D: \ Archivos de programa \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ base
command.py ", línea 223, en main
status = self.run (opciones, argumentos)
Archivo "D: \ Archivos de programa \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ comm
ands \ install.py ", línea 282, en ejecución
requisito_set.prepare_files (buscador)
Archivo "D: \ Archivos de programa \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpipreq \
req_set.py ", línea 334, en prepare_files
functools.partial (self._prepare_file, finder))
Archivo "D: \ Archivos de programa \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpipreq \
req_set.py ", línea 321, en _walk_req_to_install
more_reqs = controlador (req_to_install)
Archivo "D: \ Archivos de programa \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpipreq \
req_set.py ", línea 491, en _prepare_file
sesión = self.session)
Archivo "D: \ Archivos de programa \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ down
load.py ", línea 825, en unpack_url
sesión,
Archivo "D: \ Archivos de programa \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ down
load.py ", línea 673, en unpack_http_url
from_path, content_type = _download_http_url (enlace, sesión, temp_dir)
Archivo "D: \ Archivos de programa \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ down
load.py ", línea 886, en _download_http_url
_download_url (resp, enlace, archivo_contenido)
Archivo "D: \ Archivos de programa \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ down
load.py ", línea 621, en _download_url
para fragmento en progreso_indicador (resp_read (4096), 4096):
Archivo "D: \ Archivos de programa \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ util
s \ ui.py ", línea 135, en iter
self.next (n)
Archivo "D: \ Archivos de programa \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ progress__init __. py ", línea 73, en la siguiente
self.update ()
Archivo "D: \ Archivos de programa \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ progress \ bar.py ", línea 82, en actualización
self.writeln (línea)
Archivo "D: \ Archivos de programa \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ progress \ helpers.py ", línea 69, por escrito
imprimir (línea, fin = '', archivo = self.file)
Archivo "D: \ Archivos de programa \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ colorama \ ansitowin32.py ", línea 133, por escrito
self.write_and_convert (texto)
Archivo "D: \ Archivos de programa \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ colorama \ ansitowin32.py ", línea 161, en write_and_convert
self.write_plain_text (texto, cursor, len (texto))
Archivo "D: \ Archivos de programa \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ colorama \ ansitowin32.py ", línea 166, en write_plain_text
self.wrapped.write (texto [inicio: fin])
UnicodeEncodeError: el códec 'ascii' no puede codificar el carácter u '\ u258f' en la posición 8
: ordinal fuera del rango (128)

@ JingY0604 Ver # 3463.

Puede actualizar su pip desinstalando la instalación existente y usando get-pip.py para instalar la versión más nueva.

Para https://github.com/ofek/hatch , simplemente capturo todas las instancias de actualización y no las permito. Luego tengo una bandera explícita --self para hacer que aparezca un python -m pip install -U hatch y salga inmediatamente.

https://github.com/ofek/hatch/blob/22e621715fbed36c2bfab35ae9fa9649ea6dfe1e/hatch/cli.py#L509

editar: técnicamente, en lugar de solo python , sys.executable se usa en realidad

@ofek # 4490 hizo un cambio en pip, imprimiendo un mensaje mejor, IIRC.

Entonces, por ahora, si instalé Python sin pip, no podré instalar el módulo pip en el futuro.

c:\Python27>python.exe get-pip.py ERROR: To modify pip, please run the following command: c:\Python27\python.exe -m pip

c:\Python27>c:\Python27\python.exe -m pip install c:\Python27\python.exe: No module named pip

¡Hola @ihormelnyk!

Ese no es el caso. El condicional para esto era demasiado amplio - bloquea el uso de cualquier script con la palabra "pip" para que no modifique pip. Puede intentar cambiar el nombre de get-pip.py para que no contenga la palabra "pip", para solucionar este problema.

Una versión 10.0.1 (que probablemente ocurrirá esta semana) solucionará este problema.

@pradyunsg gracias por compartir el consejo. Tuve el mismo problema que @ihormelnyk y cambiar el nombre del archivo get-pip.py a un nombre que no contiene la palabra pip ayudó.

Imprimo pip en cmd en Windows, pero mostró
Error fatal en el iniciador: no se puede crear el proceso usando '"" d: \ archivos de programa (x86) python3.6python.exe "" D: \ Archivos de programa (x86) python3.6 \ Scriptspip.exe "'
Ya configuré el entorno para pip, pero no funciona, ¿cómo resolverlo?

@ BJQ98 Te gustaría mirar el número 5223.

pradyunsg dijo que 10.0.1 arreglaría esto, pero no sé cómo. Gracias.

C:\Users\clarkk\AppData\Local\Programs\Python\Python36>python -m pip install -U pip
Collecting pip
  Using cached https://files.pythonhosted.org/packages/0f/74/ecd13431bcc456ed390b44c8a6e917c1820365cbebcb6a8974d1cd045ab4/pip-10.0.1-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 9.0.3
    Uninstalling pip-9.0.3:
      Successfully uninstalled pip-9.0.3
  Rolling back uninstall of pip
Exception:
Traceback (most recent call last):
  File "C:\Users\clarkk\AppData\Roaming\Python\Python36\site-packages\pip\basecommand.py", line 215, in main
    status = self.run(options, args)
  File "C:\Users\clarkk\AppData\Roaming\Python\Python36\site-packages\pip\commands\install.py", line 342, in run
    prefix=options.prefix_path,
  File "C:\Users\clarkk\AppData\Roaming\Python\Python36\site-packages\pip\req\req_set.py", line 784, in install
    **kwargs
  File "C:\Users\yangg\AppData\Roaming\Python\Python36\site-packages\pip\req\req_install.py", line 851, in install
    self.move_wheel_files(self.source_dir, root=root, prefix=prefix)
  File "C:\Users\clarkk\AppData\Roaming\Python\Python36\site-packages\pip\req\req_install.py", line 1064, in move_wheel_files
    isolated=self.isolated,
  File "C:\Users\clarkk\AppData\Roaming\Python\Python36\site-packages\pip\wheel.py", line 462, in move_wheel_files
    generated.extend(maker.make(spec))
  File "C:\Users\yangg\AppData\Roaming\Python\Python36\site-packages\pip\_vendor\distlib\scripts.py", line 372, in make
    self._make_script(entry, filenames, options=options)
  File "C:\Users\clarkk\AppData\Roaming\Python\Python36\site-packages\pip\_vendor\distlib\scripts.py", line 276, in _make_script
    self._write_script(scriptnames, shebang, script, filenames, ext)
  File "C:\Users\clarkk\AppData\Roaming\Python\Python36\site-packages\pip\_vendor\distlib\scripts.py", line 212, in _write_script
    launcher = self._get_launcher('t')
  File "C:\Users\clarkk\AppData\Roaming\Python\Python36\site-packages\pip\_vendor\distlib\scripts.py", line 351, in _get_launcher
    result = finder(distlib_package).find(name).bytes
AttributeError: 'NoneType' object has no attribute 'bytes'
You are using pip version 9.0.3, however version 10.0.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.

Será lo mismo que el número 5343.

Gracias pradyunsg, la solución de alguien más resulta ser más simple. Acabo de realizar "python -m pip uninstall pip" primero, luego "python -m pip install -U pip"

Requisito ya actualizado: pip en c: \ user \ clarkk \ appdata \ local \ Programs \ Python \ Python36 \ lib \ site-packages (10.0.1)

      Personally I think it should be windows only. I view it as a work around for the way the Windows platform works, and something that's a target to eventually remove for something nicer down the road.

Recibo un error al ejecutar el comando anterior como error de sintaxis en la palabra obtener cuál podría ser la solución para esto

@AProNoob Debería ejecutar los comandos en un símbolo del sistema (cmd o powershell), no en un símbolo del sistema de Python.

¡Gracias! ¡Eso funciono!

Este hilo se ha bloqueado automáticamente ya que no ha habido ninguna actividad reciente después de que se cerró. Abra un nuevo problema para errores relacionados.

¿Fue útil esta página
0 / 5 - 0 calificaciones