Pip: mises à niveau de pip windows en place

Créé le 5 nov. 2013  ·  89Commentaires  ·  Source: pypa/pip

pas sûr de l'état de pip install --ugrade pip sur Windows.

besoin de ceci pour PEP453

@pfmoore ?

voir # 188 pour une vieille discussion à ce sujet.

windows auto-locked bug

Commentaire le plus utile

Sous Windows, utilisez les fenêtres d'invite de commandes en mode Administrateur. Puis tapez commande
python -m pip install --upgrade pip

J'espère que cela fonctionne pour vous. Voilà comment je l'ai fait fonctionner une fenêtre 10

Bonne chance.

Tous les 89 commentaires

Utilisez python -m pip install --upgrade pip . Je pense que @vsajip envisageait une forme de magie dans les wrappers exe pour signifier que l'auto-remplacement de l'exe pourrait fonctionner. Mais je ne sais pas s'il a fait quelque chose dans la version de distlib que nous utilisons. Je ne suis pas sûr que ce soit quelque chose qui pourrait être fait sans l'aide de l'application (pip). Et je suis presque sûr qu'aucun code n'a été ajouté à pip pour cela.

Personnellement, je considère que c'est un problème mineur - dire aux gens d'utiliser `` python -m pip '' me semble être une réponse parfaitement acceptable, étant donné que le problème est fondamental dans la manière dont Windows gère la suppression des fichiers ouverts.

En fin de compte, la question sera de savoir combien de complexité (avec le coût de maintenance qui en résulte) et de risque que nous voulons assumer pour résoudre ce problème.

Personnellement, je suis d'accord avec pip install --upgrade pip impression d'un message à utiliser python -m pip install --upgrade pip . Je ne pense tout simplement pas que nous devrions lancer une erreur sur les descripteurs de fichiers ouverts ou quelle que soit l'exception.

J'étais sur le point de dire la même chose.

Voici une question - voudriez-vous que ce message n'apparaisse que sur Windows, ou serait-il raisonnable de dire la même chose sous Unix (pour une expérience utilisateur cohérente). Personnellement, j'aimerais être cohérent sur toutes les plateformes (car il est plus facile de documenter de cette façon).

De plus, nous devrions intercepter toute commande qui tente de (ré) installer pip - pip install -I pip est une autre, par exemple.

Personnellement, je pense que ce ne devrait être que Windows. Je le vois comme un moyen de contourner le fonctionnement de la plate-forme Windows et quelque chose qui est une cible à supprimer éventuellement pour quelque chose de plus agréable sur la route.

Je savais que vous alliez dire cela :-(

Franchement, je ne crois pas que nous obtiendrons jamais «quelque chose de plus agréable», essentiellement parce que nous n'avons pas assez d'expertise Windows pour le développer et le maintenir. Je connais _aucun logiciel Windows avec une solution satisfaisante d'auto-remplacement des exécutables. Je n'ai certainement pas de réponse, et je ne m'attendrais pas à ce qu'aucun des développeurs basés sur Unix puisse vous aider. Même si nous avons obtenu quelque chose, cela risque d'être complexe et donc une source probable de pourriture des bits et de bugs obscurs.

Faire une solution qui fonctionne sur toutes les plateformes la "réponse officielle" me semble éviter d'envoyer des messages déroutants à l'utilisateur. Sauvegardez-le avec un avertissement comme décrit et nous avons une solution robuste, même si ce n'est pas aussi parfait que de faire fonctionner pip install -U pip .

Veuillez excuser un certain niveau de grognon léger dans cette réponse, causé par le sentiment que c'est toujours la plate-forme Windows qui doit être celle à compromettre - je ne veux pas en faire un problème. En pratique, j'irai avec quel que soit le consensus. Je ne pense pas que ce soit un gros problème.

FWIW, mon objectif après PEP453 est de mettre en place notre propre infrastructure de test qui inclut Windows, donc j'espère que cela résoudra certains des problèmes de Windows Bitrot.

Je peux comprendre la grognon cependant :) Si nous concevions ce système tout nouveau, je serais beaucoup plus modifiable, mais je ne pense pas qu'il soit convivial de casser pip install -U pip pour tout ce qui n'est pas Windows maintenir la cohérence. S'il s'agissait d'une toute nouvelle chose, il n'y a pas (ou moins) d'attentes de l'utilisateur:]

OK, cela semble juste. Vous avez raison, l'utilisation historique est plus importante ici.

En fait, je n'ai aucune idée de ce qu'est l'expérience utilisateur sous Unix, donc je suis probablement tout aussi coupable de pensée unilatérale que quiconque. Je dois essayer de voir comment utiliser Python sur Linux - existe-t-il une bonne ressource «Python sur Linux pour les débutants» qui montre comment configurer un environnement Python (3), configurer les différents outils, etc.? [Une chose que je trouve toujours qui n'est pas couverte, c'est comment faire tourner "python" Python 3 par défaut, comment faire "virtualenv" construire des virtualenvs Python 3 par défaut, tout ce genre de chose - il me semble que Python 3 est beaucoup plus de seconde classe sous Unix que sous Windows, assez curieusement.]

En règle générale, vous ne voulez pas faire pointer python vers python3 sur * nix car le système utilise Python et toutes leurs bibliothèques ne seront pas portées vers Python3. Cependant, il existe des distributions Linux qui ont Python3 par défaut maintenant ... Je pense que Arch? Et peut-être le prochain Fedora?

Hmm, je ne parle pas au niveau du système, mais vous ne pouvez vraiment pas choisir quoi utiliser pour Python dans votre compte personnel? Cela fait définitivement de Python 3 une deuxième classe, à mon avis ... Mais cela explique pourquoi les utilisateurs d'Unix ne semblent pas trouver l'utilisation de choses comme "pip3" ou "pip3.3" aussi moche que sin :-)

(De toute façon, nous sommes bien hors sujet ici, alors tant pis).

Vous pouvez configurer votre shell pour qu'il ait ~ / bin / avant le bin système et y ajouter un lien symbolique de python vers python3, mais oui hors-sujet. Je serai ravi de vous aider si vous êtes réellement intéressé par la configuration des choses:] IRC ou Email.

Mon travail auquel je pense que Paul faisait référence était juste d'implémenter la danse «deleteme» pour remplacer les fichiers en cours d'utilisation (c'est-à-dire les wrappers exe) - c'est dans le code distlib Python, pas dans les wrappers .exe. Ceci est dans le module distlib.scripts et doit être exercé chaque fois que ce module est utilisé pour créer un script.

Alors peut-être que cela est déjà résolu pour Wheels? Et c'est un problème setuptools autrement?

Cela semble possible. Je vais faire quelques tests aujourd'hui, si je peux.

Malheureusement non, du moins avec "pip install -I pip". (Il est difficile de tester une mise à niveau réelle, car seule la dernière version absolue de pip prend en charge le wrapper de script):

>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

Donc pip n'utilise pas distlib.scripts pour installer des scripts ... Je suppose que cela ne rentre pas dans le workflow pip .

Je soupçonne que c'est parce que nous faisons une désinstallation puis une installation, plutôt qu'une installation écrasant ce qui est là (pour des raisons évidentes).

Windows ne permet pas d'écraser ou de supprimer les fichiers exe ouverts, mais il permet de les renommer / de les déplacer.

Eh bien, avec un peu de folie avec l'API Win32, vous pouvez fermer le handle à pip.exe tout comme vous le pouvez lorsque vous utilisez l'explorateur de processus de Sysinternal.

Je ne pense pas que vous puissiez fermer toutes les poignées de l'exe en cours d'exécution. Mais si vous avez un code de travail comme exemple, j'aimerais le voir, car cela a longtemps été un problème dont les gens ont débattu et le consensus a toujours été que ce n'est pas possible (sauf par des astuces comme "renommer et supprimer plus tard" ). Un code de travail qui fait cela serait extrêmement utile à la communauté.

Rencontrez le même problème.

En guise de piratage rapide, pip.exe peut-il détecter qu'il est mis à niveau avant son exécution et redémarrer lui-même avec python -m pip {{ sys.argv }} ?

Je ne pense pas que cela fonctionne réellement.

Mais peut-être une pensée stupide, afaik le .exe n'a pas besoin d'être mis à jour, pouvons-nous juste un cas spécial pip.exe et le laisser tranquille? Laisserait peut-être un pip.exe traîner après une installation.

@dstufft correct, "redémarrer soi-même" n'est pas aussi simple que @techtonik le fait sonner sous Windows, où il n'y a pas d'équivalent à l'appel Unix exec .

Techniquement, pip.exe peut nécessiter une mise à jour si le point d'entrée change ou si le code du wrapper distlib est changé. Ce n'est pas courant, mais cela peut arriver (au début, le code distlib a changé un peu jusqu'à ce que les choses se stabilisent). Ce qu'il est possible de faire serait d'écrire le nouveau pip.exe dans un emplacement temporaire, puis s'il est identique à celui actuel, sautez-le. Vous n'éviterez pas les erreurs lorsqu'il a besoin d'être mis à jour, mais dans 99% des cas où ce n'est pas le cas, tout ira bien.

BTW, nous tournons en rond ici. Selon les commentaires précédents de Vinay, cela est résolu dans distlib (c'est là que je pense qu'il devrait être résolu) mais pip n'utilise pas l'API d'une manière qui lui permet de fonctionner. Si nous pouvions utiliser la solution distlib, tant mieux. Sinon, nous avons besoin de quelqu'un pour écrire une solution spécifique à pip (et je reste sceptique que cela puisse être fait d'une manière robuste et maintenable qui n'est pas beaucoup plus complexe que le problème le justifie).

Suggestion:

  1. Quelqu'un ajoute une section à la documentation pip à http://www.pip-installer.org/en/latest/installing.html#install-or-upgrade-pip en notant que la solution python -m pip contournement
  2. Si quelqu'un a une solution viable et est prêt à la mettre en œuvre, il devrait soulever un PR et nous pourrons examiner le code réel plutôt que les approches proposées.

Je pense que nous sommes au stade où le code de travail réel est la seule chose qui fera avancer ce problème.

Je suis -1 sur le gonflement des documents sans essayer d'autres solutions.

Je suis +1 sur la documentation de ce qui fonctionne actuellement.

Même avec un commentaire doc, c'est toujours une solution de contournement - pas une solution, et vous avez une invite de commande pour Windows erronée.

C'est peut-être fou mais je fais toujours ça:

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

bien sûr, cela nécessite que l'on ait libcurl, mais il y a des binaires Windows disponibles ici .

J'ai essayé de l'installer sur un Mac mais j'ai reçu ceci

Alexs-MacBook- Air: Pipmodules aleand $ pip install -U pip
-bash: pip: commande introuvable
Alexs-MacBook- Air: Pipmodules aleand $ python get-pip.py
Téléchargement / déballage de pip
Téléchargement de pip-1.5.5-py2.py3-none-any.whl (1,2 Mo): 1,2 Mo téléchargé
Installation des packages collectés: pip
Nettoyer...
Exception:
Traceback (dernier appel le plus récent):
Fichier "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/basecommand.py", ligne 122, en main
status = self.run (options, arguments)
Fichier "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/commands/install.py", ligne 283, en cours d'exécution
jeu_exigence.install (options_installation, options_globales, racine = options.chemin_racine)
Fichier "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/req.py", ligne 1435, en cours d'installation
exigence.install (options_installation, options_globales, _args, * _kwargs)
Fichier "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/req.py", ligne 671, en cours d'installation
self.move_wheel_files (self.source_dir, racine = racine)
Fichier "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/req.py", ligne 901, dans move_wheel_files
pycompile = self.pycompile,
Fichier "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/wheel.py", ligne 215, dans move_wheel_files
clobber (source, lib_dir, True)
Fichier "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/wheel.py", ligne 205, dans clobber
os.makedirs (destdir)
Fichier "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py", ligne 157, dans makedirs
mkdir (nom, mode)
OSError: [Errno 13] Autorisation refusée: '/Library/Python/2.7/site-packages/pip'

Stockage du journal de débogage en cas d'échec dans /Users/aleand/Library/Logs/pip.log

@zaducu , je peux dire à partir de votre traceback que vous essayez de mettre à jour la version de pip qui se trouve dans la version de Python préinstallée avec votre mac. Puisque vous mettez à jour la version préinstallée, vous devrez améliorer vos informations d'identification en utilisant sudo :

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

Pour utiliser sudo vous devrez peut-être vous ajouter à /etc/sudousers . Google et vous trouverez de nombreux liens montrant comment procéder.

Mac est intelligent, il garde vos paquets dans /Library/Python au lieu de corrompre votre dossier /System/Frameworks/Python.framework site-pacakges . Yay! Mais pour accéder à ce dossier, vous devez être un administrateur avec les privilèges root, donc sudo .

Une alternative à considérer est de garder vos packages et modules personnels séparés en utilisant virtualenv et / ou un dossier .local . Pour installer des packages dans un dossier local, utilisez distutils au lieu de pip et suivez les instructions d' installation des modules python .

D'autres alternatives à l'utilisation du Python pré-installé sont d'utiliser Python officiel , homebrew , MacPorts, Fink ou de le construire vous-même.

Pour Python officiel, vous aurez toujours besoin de sudo mais il installera la plupart des éléments dans /System/Frameworks pas /System/Library/Frameworks Pour Homebrew, vous ne devriez pas avoir besoin de sudo . Je ne peux pas parler pour MacPorts ou Fink.

J'ai toujours le même problème sous Windows, en passant de la version 1.5.4 à la version 6.0.8:

E: \ Distrib \ Programming> pip install -U pip
Téléchargement / décompression de pip depuis https://pypi.python.org/packages/py2.py3/p/pip/pip-6.0.8-py2.py3-none-any.whl#md5 = 41e73fae2c86ba2270ff51c1d86
f7e09
Installation des packages collectés: pip
Installation existante trouvée: pip 1.5.4
Désinstallation de pip:
Pip correctement désinstallé
Nettoyer...
Exception:
Traceback (dernier appel le plus récent):
Fichier "C: \ Python \ 3.3-32 \ lib \ shutil.py", ligne 371, dans _rmtree_unsafe
os.unlink (nom complet)
PermissionError: [WinError 5] Отказано в доступе: 'c: \ users \ bialix \ appdata \ local \ temppip-6i_i7a-uninstallpython \ 3.3-32 \ scripts \ p
ip.exe '

Lors de la gestion de l'exception ci-dessus, une autre exception s'est produite:

Traceback (dernier appel le plus récent):
Fichier "C: \ Python \ 3.3-32 \ lib \ site-packagespip \ basecommand.py", ligne 122, dans main
write_debug_log = check_path_owner (debug_log_path)
Fichier "C: \ Python \ 3.3-32 \ lib \ site-packagespip \ commands \ install.py", ligne 283, en cours d'exécution
build_delete = (pas (options.no_clean ou options.build_dir))
Fichier "C: \ Python \ 3.3-32 \ lib \ site-packagespipreq.py", ligne 1443, en cours d'installation
Fichier "C: \ Python \ 3.3-32 \ lib \ site-packagespipreq.py", ligne 610, dans commit_uninstall
Fichier "C: \ Python \ 3.3-32 \ lib \ site-packagespipreq.py", ligne 1860, dans commit
Fichier "C: \ Python \ 3.3-32 \ lib \ site-packagespip \ util.py", ligne 43, dans rmtree
Fichier "C: \ Python \ 3.3-32 \ lib \ shutil.py", ligne 478, dans rmtree
return _rmtree_unsafe (chemin, une erreur)
Fichier "C: \ Python \ 3.3-32 \ lib \ shutil.py", ligne 368, dans _rmtree_unsafe
_rmtree_unsafe (nom complet, onerror)
Fichier "C: \ Python \ 3.3-32 \ lib \ shutil.py", ligne 368, dans _rmtree_unsafe
_rmtree_unsafe (nom complet, onerror)
Fichier "C: \ Python \ 3.3-32 \ lib \ shutil.py", ligne 368, dans _rmtree_unsafe
_rmtree_unsafe (nom complet, onerror)
Fichier "C: \ Python \ 3.3-32 \ lib \ shutil.py", ligne 373, dans _rmtree_unsafe
onerror (os.unlink, nom complet, sys.exc_info ())
Fichier "C: \ Python \ 3.3-32 \ lib \ site-packagespip \ util.py", ligne 62, dans rmtree_errorhandler
PermissionError: [WinError 5] Отказано в доступе: 'c: \ users \ bialix \ appdata \ local \ temppip-6i_i7a-uninstallpython \ 3.3-32 \ scripts \ p
ip.exe '

Des changements sur ce problème?

Ce n'est pas réparable dans un sens pratique (au moins, quelqu'un devrait fournir un correctif complet et fonctionnel pour l'évaluation s'il pensait que c'était le cas, car personne n'a encore trouvé un moyen de le réparer - c'est essentiellement une limitation de Windows).

La bonne façon de mettre à niveau pip sous Windows est python -m pip install -U pip .

@pfmoore Et 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 Soupir. Je déteste avoir à penser à Python 2.6 :-)

Si je me souviens bien, python -m pip.__main__ y fonctionne. Je n'ai pas de copie de Python 2.6 à portée de main pour le tester pour le moment, désolé ...

Je viens de tester Python 2.6, et python -m pip.__main__ fonctionne effectivement.

salut!

python -m pip install -U pip ne fonctionne pas pour moi (w7, powershell, python installé via chocolatey); l'installation échoue avec des problèmes d'autorisation:

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'

Pensées?

Il n'y a aucun moyen de verrouiller ce fichier ou de ne pas avoir l'autorisation de le supprimer. Serait-ce un problème chocolaté? Pouvez-vous supprimer ce fichier manuellement à partir d'une invite de commande?

@AmazingHorse avez-vous essayé

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

en supposant que vous avez cURL ?

Intéressant, @pfmoore , ce fichier est verrouillé même sur une invite de commande administrateur.

Donc, cela ressemble à un problème d'autorisations Windows plutôt qu'à quelque chose avec pip.

Est-ce que cela a à voir avec le fait que mon python a été installé en dehors de la structure de répertoire Windows dans C:?

Je vais regarder ça mais je suis curieux de savoir si quelqu'un peut poster ici ce qu'il pourrait penser que cela serait causé.

Acclamations gars

@AmazingHorse Honnêtement, je n'en ai aucune idée. L'autre possibilité est qu'il se peut qu'il y ait quelque chose de particulier dans la façon dont Chocolatey installe Python - peut-être signaler le problème sur leur tracker (je suppose qu'ils en ont un?) Et voir ce qu'ils disent.

Mais oui, ce n'est pas un problème de pip à cause du son.

Windows permet de renommer / déplacer les fichiers mappés en mémoire (mappés sous forme d'image ou de données) vers un nouveau nom sur le même volume. Ainsi, le gestionnaire d'erreurs rmtree peut essayer de renommer le fichier pour le déplacer vers le répertoire temporaire de base. Au moins là, cela n'interférera pas avec la suppression du répertoire. Cette solution de contournement échoue si le fichier se trouve sur un volume différent de celui du répertoire temporaire, ou pour une violation de partage ou si l'ACL du fichier empêche l'opération. Mais aucun de ceux-ci ne devrait s'appliquer dans ce cas.

Si le groupe Administrateurs est activé dans le jeton de processus, la suppression du fichier renommé peut être planifiée au redémarrage du système. Utilisez simplement des ctypes pour appeler MoveFileExW(path, None, MOVEFILE_DELAY_UNTIL_REBOOT) . Cependant, cela échoue pour les utilisateurs réguliers, car ils ne sont pas autorisés à modifier la valeur de registre PendingFileRenameOperations du gestionnaire de session.

pip sur Windows 7/10 fonctionne bien sauf pour la mise à jour> pip install --upgrade pip
J'essaie de charger le moins possible sur mon C: \ (SSD) et d'installer le logiciel dans l'arborescence à partir de D: \ NUC \
Voici ce que je vois:

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'

Le chemin du dossier AppData est disponible sur mon lecteur D:, je me demande comment gérer au mieux cette situation pour les outils et l'utilisation ultérieurs. Pensé à une jonction, mais cela ressemblera toujours à un lecteur différent. Peut-être que script les différences de l'emplacement prévu à l'emplacement réel pour vérifier le chemin correct? Avant de faire cela, pip a très bien installé django (mais s'est plaint de la version qui a conduit à cette découverte). hmmm ... et maintenant pip semble cassé.

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>

vous devez faire python.exe -m pip install --upgrade pip

Sur Python 2.6, vous devez exécuter python -m pip.__main__ install -U pip

Je considère que la situation actuelle est vraiment mauvaise pour les nouveaux utilisateurs de Python ainsi que pour les anciens utilisateurs de Python comme moi qui n'utilisent généralement pas Windows. Je suis tout à fait bien en utilisant python -m pip install --upgrade pip , mais je pense vraiment que pip install --upgrade pip devrait le recommander automatiquement sur Windows. @dstufft a déjà proposé cela en 2013. Y a-t-il une bonne raison de ne pas le faire?

PS: Désolé d'avoir signalé le # 3462 comme un double de ce problème. Je n'ai pas trouvé ce problème en recherchant dans le tracker WindowsError . J'espère qu'après ce commentaire, d'autres le feront à l'avenir.

A ma connaissance, c'est déjà la commande que pip propose à l'utilisateur lors de la détection d'une nouvelle version de lui-même. La situation n'est pas si mauvaise.

@pekkaklarck La principale raison de ne pas le faire est que c'est vraiment difficile à repérer. Pour commencer, je ne sais pas comment détecter de manière fiable que pip est exécuté à partir de pip.exe plutôt que de python -m pip . Et même si vous détectez cela, vous devez vérifier si pip est dans les éléments en cours d'installation (considérez pip install --upgrade -r http://some.remote/requirements.txt - au moment où vous avez lu le fichier des exigences, il est sans doute trop tard pour émettre le message).

Bien sûr, quelque chose qui n'est pas parfait à 100% est une chose tout à fait raisonnable à mettre en œuvre - c'est de s'assurer que nous ne nous opposons pas à des utilisations entièrement valides, plutôt que de nous assurer que nous attrapons tous les cas secondaires, c'est vraiment important.

Nous envisagerions certainement de fusionner un PR pour résoudre ce problème, mais je ne pense pas qu'aucun des principaux développeurs de pip trouve le problème suffisamment problématique pour tenter de le réparer lui-même (je suis probablement l'utilisateur Windows le plus lourd des développeurs de base, et Je trouve que se souvenir d'utiliser python -m pip raisonnablement facile).

pour savoir si nous sommes pip[.exe] ou non, j'imagine

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

fonctionnerait très bien. Un simple avertissement de voir [-U|--upgrade] et pip dans l'invocation serait probablement suffisant pour corriger 90% des appels.

@stonebig : Pourriez-vous préciser quand cette commande est recommandée? J'ai essayé pip install -U pip après une nouvelle installation de Python 2.7.11 et cela a échoué avec cette erreur:

WindowsError: [Erreur 5] L'accès est refusé: 'c: \ users \ koulutus \ appdata \ local \ temppip-65z4kx-uninstallpython27 \ scriptspip.exe'

@pfmoore : la mise à niveau de pip dans le fichier d'exigences semble assez rare et pourrait probablement être ignorée. Comme @Ivoz, je pensais que pip.exe serait en sys.argv . Sinon, il devrait être possible d'attraper le WindowsError et d'y réagir.

@Ivoz ça marche? Je pensais que le wrapper pip.exe invoquait python comme sous-processus, donc cela ne fonctionnerait pas. Mais un test rapide (impression de sys.argv[0] dans pip.main() ) montre:

>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:

Cela fonctionne, mais vous devez faire attention à la façon dont vous repérez pip dans sys.argv[0] (notez que le premier exemple inclut le répertoire pip dans le chemin vers __main__.py )

Merci de l'avoir signalé. J'ai appris quelque chose aujourd'hui :-)

@pekkaklarck Le problème avec la capture du WindowsError (si je me souviens bien) est que cela arrive assez tard et que l'installation est partiellement terminée (et pas facile à restaurer).

Mais je ne veux décourager personne d'essayer de résoudre ce problème, alors je vais en rester là :-)

mais vous devez faire attention à la façon dont vous repérez pip dans sys.argv [0]

@pfmoore d' où l'appel à os.path.basename .

@Ivoz Sigh. Trop tard dans la nuit ici. Oui bien sûr :-)

@pekkaklarck . par exemple en faisant pip list (sous windows). Autant que je me souvienne lors des discussions de l'année dernière:

  • c'était la seule solution que l'équipe pypa avait imaginée comme fiable,
  • il n'apparaît que sur les fenêtres.

pip_example

Il pourrait y avoir une meilleure solution, mais je suppose que c'est déjà 80% d'une réponse parfaite de la situation précédente.

Peut-être qu'une meilleure solution serait d'avoir un "upgrade_pip.bat" livré avec l'installation Windows par défaut de python, pas serré à "pip", et cela ferait cette commande. (ou pip_update.bat pour mieux correspondre à conda?)

Je l'ai frappé aujourd'hui en plongeant dans la nouvelle expérience utilisateur Windows Python. C'était terrible.
Pouvons-nous rendre -m automatique pour cette commande? (peut-être donner sa propre commande à la mise à niveau de pip?)

Aucun utilisateur ne devrait jamais avoir à voir cela, surtout après avoir exécuté exactement la commande _pip leur a dit d'exécuter_.

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

Je pense que nous avons déjà la configuration de la journalisation dans les versions plus récentes de pip que 7.0.1 pour dire aux utilisateurs de Windows d'utiliser python -m pip install --upgrade pip au lieu de pip install --upgrade pip .

: sparkles:: cake:: sparkles:

Oui, depuis 7.1 cf # 2830

\ O /

Je ne peux pas mettre à jour mon pip sur Win 10, qu'est-ce qui ne va pas?

default

@grasx
Si vous voulez vraiment savoir ce qui ne va pas, veuillez lire ce fil de discussion. Si vous souhaitez uniquement que cela fonctionne, veuillez lire la dernière ligne de la sortie que vous avez obtenue et la comparer avec ce que vous avez exécuté.

@ piotr-dobrogost
C'est ça? La dernière ligne rouge semble indiquer un problème de décodage, plutôt que l'erreur d'accès refusé qui est le résultat habituel d'une mise à jour en place sous Windows. Le problème de @grasx pourrait-

Je doute que le problème rencontré par @grasx soit lié à ce problème. J'ai cependant vu des problèmes similaires sur Windows. Voir # 3463.

@nmusatti
Vous avez raison. Ma faute.

@ piotr-dobrogost @nmusatti @pekkaklarck Cependant, merci, j'ai changé le nom de l'utilisateur, donc maintenant il ne contient que des caractères ASCII et pip a été mis à jour avec succès vers la 8.1

@grasx a changé le nom de l'utilisateur? Je suis confus dans ce que vous avez dit ... J'ai eu le même problème, quelque chose de différent est que j'étais dans Windows 7

idée aléatoire, que diriez-vous de ne pas remplacer le fichier exe si ce n'est pas nécessaire

pour autant que je sache, les fichiers exe sont de très petits trampolines qui fonctionnent généralement

la logique la plus importante se trouve dans les fichiers de script d'accompagnement

@ pzz2011 En fait, j'ai réinstallé mon win et défini un nouveau nom d'utilisateur. C'était plus facile dans mon cas alors de savoir comment le changer dans tous les endroits et itinéraires où il est mentionné :)

@RonnyPfannschmidt Dépend de ce qui est utilisé pour écrire le .exe - setuptools utilisé pour utiliser foo.exe + foo-script.py (pas sûr de ce qu'il fait maintenant), alors que distlib (si configuré) crée un seul foo.exe qui intègre le script.

@grasx hhh ... J'ai trouvé un moyen plus simple de le résoudre. Je viens de réinstaller le python de 2.7.x à 2.7.10.
Puis le succès me sourit ~

Sous Windows, utilisez les fenêtres d'invite de commandes en mode Administrateur. Puis tapez commande
python -m pip install --upgrade pip

J'espère que cela fonctionne pour vous. Voilà comment je l'ai fait fonctionner une fenêtre 10

Bonne chance.

@grasx Je ne

Juste un FYI, pour les utilisateurs de Windows. Si vous installez Cygwin, Python2.7 est automatiquement installé. Il ne vous reste plus qu'à exécuter:

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

(Oui, vous devez d'abord installer wget .)

image
Comment résoudre ce problème?

@ JingY0604
Voir Pour copier du texte à partir d'une fenêtre d'invite de commande pour une explication sur la façon de copier du texte ici. De cette façon, le texte que vous publiez sera consultable.

Vous utilisez la version 7.1.0 de pip, mais la version 9.0.1 est disponible.
Vous devriez envisager de mettre à jour via la comm 'python -m pip install --upgrade pip'
et.
D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_vendorrequ
ests \ packages \ urllib3 \ util \ ssl_.py: 90: InsecurePlatformWarning: Un vrai SSLContex
L'objet t n'est pas disponible. Cela empêche urllib3 de configurer SSL approprié
et peut entraîner l'échec de certaines connexions SSL. Pour plus d'informations, voir htt
ps: //urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
Plates-formes non sécurisées
Collecte de pip
Téléchargement de pip-9.0.1-py2.py3-none-any.whl (1,3MB)
Exception:
Traceback (dernier appel le plus récent):
Fichier "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ base
command.py ", ligne 223, dans main
status = self.run (options, arguments)
Fichier "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ comm
ands \ install.py ", ligne 282, en cours d'exécution
requirements_set.prepare_files (chercheur)
Fichier "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpipreq \
req_set.py ", ligne 334, dans prepare_files
functools.partial (self._prepare_file, finder))
Fichier "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpipreq \
req_set.py ", ligne 321, dans _walk_req_to_install
more_reqs = gestionnaire (req_to_install)
Fichier "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpipreq \
req_set.py ", ligne 491, dans _prepare_file
session = auto.session)
Fichier "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ down
load.py ", ligne 825, dans unpack_url
session,
Fichier "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ down
load.py ", ligne 673, dans unpack_http_url
from_path, content_type = _download_http_url (lien, session, rép_temp)
Fichier "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ down
load.py ", ligne 886, dans _download_http_url
_download_url (resp, lien, content_file)
Fichier "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ down
load.py ", ligne 621, dans _download_url
pour le bloc en cours_indicator (resp_read (4096), 4096):
Fichier "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ util
s \ ui.py ", ligne 135, dans iter
self.next (n)
Fichier "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ progress__init __. py ", ligne 73, dans la prochaine
self.update ()
Fichier "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ progress \ bar.py ", ligne 82, dans la mise à jour
self.writeln (ligne)
Fichier "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ progress \ helpers.py ", ligne 69, dans writeln
print (ligne, fin = '', fichier = self.file)
Fichier "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ colorama \ ansitowin32.py ", ligne 133, en écriture
self.write_and_convert (texte)
Fichier "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ colorama \ ansitowin32.py ", ligne 161, dans write_and_convert
self.write_plain_text (texte, curseur, len (texte))
Fichier "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ colorama \ ansitowin32.py ", ligne 166, dans write_plain_text
self.wrapped.write (texte [début: fin])
UnicodeEncodeError: le codec 'ascii' ne peut pas encoder le caractère u '\ u258f' en position 8
: ordinal pas dans l'intervalle (128)

@ JingY0604 Voir # 3463.

Vous pouvez mettre à niveau votre pip en désinstallant l'installation existante et en utilisant get-pip.py pour installer la nouvelle version.

Pour https://github.com/ofek/hatch, j'attrape simplement toutes les instances de mise à jour de soi et je l'interdis. J'ai alors un indicateur --self explicite pour faire apparaître un python -m pip install -U hatch et sortir immédiatement.

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

edit: techniquement, au lieu de seulement python , sys.executable est utilisé en fait

@ofek # 4490 a fait un changement dans pip, imprimant un meilleur message, IIRC.

Donc pour l'instant, si j'ai installé python sans pip, je ne pourrai plus installer le module pip à l'avenir?

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

Salut @ihormelnyk!

Ce n'est pas le cas. Le conditionnel pour cela était trop large - il empêche l'utilisation de tout script contenant le mot «pip» de modifier pip. Vous pouvez essayer de renommer get-pip.py pour ne pas contenir le mot «pip», pour contourner ce problème.

Une version 10.0.1 (qui se produira probablement cette semaine) résoudra ce problème.

@pradyunsg merci d'avoir partagé le conseil. J'ai eu le même problème que @ihormelnyk et renommer le fichier get-pip.py en un nom qui ne contient pas le mot pip aidé.

J'imprime pip dans cmd inwindows, mais il a montré
Erreur fatale dans le lanceur: impossible de créer le processus en utilisant '"" d: \ program files (x86) python3.6python.exe "" D: \ Program Files (x86) python3.6 \ Scriptspip.exe "'
J'ai déjà défini l'environnement pour pip, mais cela ne fonctionne pas, comment le résoudre?

@ BJQ98 Vous voudriez regarder # 5223.

pradyunsg a dit que 10.0.1 réglerait ce problème, mais je ne sais pas comment. Merci.

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.

Ce sera la même chose que # 5343.

Merci pradyunsg, la solution de quelqu'un d'autre s'avère plus simple. Je viens d'exécuter "python -m pip uninstall pip" d'abord, puis "python -m pip install -U pip"

Exigence déjà à jour: pip dans 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.

J'obtiens une erreur lors de l'exécution de la commande ci-dessus en tant qu'erreur de syntaxe du mot obtenir quelle pourrait être la solution pour cela

@AProNoob Vous devez exécuter les commandes à une invite de commande (cmd ou powershell), et non à une invite Python.

Merci! Ça a marché!

Ce thread a été automatiquement verrouillé car il n'y a eu aucune activité récente après sa fermeture. Veuillez ouvrir un nouveau numéro pour les bogues associés.

Cette page vous a été utile?
0 / 5 - 0 notes