Pip: atualizações de pip do windows in-place

Criado em 5 nov. 2013  ·  89Comentários  ·  Fonte: pypa/pip

não tenho certeza do status de pip install --ugrade pip no Windows.

preciso disso para PEP453

@pfmoore ?

veja # 188 para uma discussão antiga sobre isso.

windows auto-locked bug

Comentários muito úteis

No Windows, use as janelas do Prompt de Comando no modo Administrador. Então digite o comando
python -m pip install --upgrade pip

Espero que funcione para você. Foi assim que consegui funcionar no Window 10

Boa sorte.

Todos 89 comentários

Use python -m pip install --upgrade pip . Acho que @vsajip estava considerando alguma forma de mágica nos invólucros do exe para significar que a auto-substituição do exe poderia funcionar. Mas não sei se ele fez alguma coisa na versão da distlib que estamos usando. Não tenho certeza se é algo que _pode_ ser feito sem a ajuda do aplicativo (pip). E tenho certeza de que nenhum código foi adicionado ao pip para isso.

Pessoalmente, considero isso um problema menor - dizer às pessoas para usar `python -m pip`` parece-me uma resposta perfeitamente aceitável, dado que o problema é fundamental para como o Windows lida com a exclusão de arquivos abertos.

Em última análise, será uma questão de quanta complexidade (com o consequente custo de manutenção) e risco queremos assumir para resolver isso.

Pessoalmente, não há problema em pip install --upgrade pip imprimir uma mensagem para usar python -m pip install --upgrade pip . Eu só não acho que devemos lançar um erro sobre identificadores de arquivo aberto ou qualquer que seja a exceção.

Eu estava prestes a dizer a mesma coisa.

Aqui está uma pergunta - você gostaria que a mensagem apareça apenas no Windows ou seria razoável dizer o mesmo no Unix (para uma experiência de usuário consistente). Pessoalmente, gostaria de ser consistente em todas as plataformas (porque é mais fácil documentar dessa forma).

Além disso, devemos capturar qualquer comando que tente (re) instalar pip - pip install -I pip é outro, por exemplo.

Pessoalmente, acho que deveria ser apenas o Windows. Eu vejo isso como uma solução alternativa para o funcionamento da plataforma Windows e algo que pode ser removido para algo mais agradável no futuro.

Eu sabia que você ia dizer isso :-(

Francamente, não acredito que jamais conseguiremos "algo melhor", basicamente porque não temos experiência suficiente em Windows para desenvolvê-lo e mantê-lo. Não conheço _nenhum_ software Windows com uma solução satisfatória de auto-substituição de executáveis. Certamente não tenho uma resposta e não espero que nenhum dos desenvolvedores baseados em Unix seja capaz de ajudar. Mesmo se conseguirmos algo, é provável que seja complexo e, portanto, uma fonte provável de podridão de bits e bugs obscuros.

Fazendo uma solução que funcione em todas as plataformas a "resposta oficial" parece-me evitar o envio de mensagens confusas para o usuário. Faça backup com um aviso conforme descrito e temos uma solução robusta, mesmo que não seja tão perfeita quanto fazer pip install -U pip funcionar.

Por favor, desculpe um certo nível de mau humor nesta resposta, causado por uma sensação de que é sempre a plataforma Windows que deve ser a única a comprometer - não quero fazer disso um problema. Na prática, irei com qualquer consenso. Não acho que seja grande coisa.

FWIW, meu objetivo depois que o PEP453 estiver pronto é fazer com que nossa própria infraestrutura de teste seja testada, incluindo o Windows, então espero que isso resolva alguns dos problemas de bittrot do Windows.

Eu posso entender o mau humor, no entanto :) Se estivéssemos projetando este sistema totalmente novo, eu seria muito mais adaptável a isso, mas não acho que seja amigável quebrar pip install -U pip para tudo que não seja Windows para manter a consistência. Se isso era uma coisa nova, então não há (ou pelo menos) expectativa do usuário:]

OK, isso parece justo. Você está certo de que o uso histórico é mais importante aqui.

Na verdade, não tenho nenhuma noção de como é a experiência do usuário no Unix, então provavelmente sou tão culpado de pensar unilateralmente quanto qualquer outra pessoa. Devo tentar ver como é usar Python no Linux - existe um bom recurso "Python no Linux para iniciantes" que mostra como configurar um ambiente Python (3), obter as várias ferramentas configuradas, etc? [Uma coisa que sempre acho que não é abordada, é como fazer "python" executar Python 3 por padrão, como fazer "virtualenv" construir Python 3 virtualenvs por padrão, todo esse tipo de coisa - me parece que Python 3 é muito mais de segunda classe no Unix do que no Windows, por incrível que pareça.]

Normalmente você não quer fazer python apontar para python3 em * nix porque o sistema usa Python e nem todas as suas bibliotecas serão portadas para Python3. No entanto, existem algumas distros Linux que têm Python3 como padrão agora ... Eu acho que Arch? E talvez o próximo Fedora?

Hmm, não estou falando em nível de sistema, mas você realmente não pode escolher o que usar para Python em sua conta pessoal? Isso definitivamente torna o Python 3 de segunda classe, na minha maneira de pensar ... Mas explica por que os usuários Unix não parecem achar o uso de coisas como "pip3" ou "pip3.3" tão feio quanto o pecado :-)

(De qualquer forma, estamos muito longe do assunto aqui, então não importa).

Você pode configurar seu shell para que tenha ~ / bin / antes do bin do sistema e adicionar um link simbólico de python para python3, mas sim offtopic. Fico feliz em ajudar se você estiver realmente interessado em configurar as coisas:] IRC ou e-mail.

Meu trabalho, ao qual acredito que Paul se referia, era apenas implementar a dança 'deleteme' para substituir arquivos em uso (ou seja, wrappers exe) - que está no código Python distlib , não nos wrappers .exe. Isso está no módulo distlib.scripts e deve ser exercido sempre que esse módulo for usado para criar um script.

Então, talvez isso já esteja resolvido para Wheels? E é um problema de setuptools de outra forma?

Parece possível. Vou fazer alguns testes hoje, se puder.

Infelizmente não, pelo menos com "pip install -I pip". (É difícil testar uma atualização real, pois apenas a última versão absoluta do pip tem suporte para 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

Então pip não está usando distlib.scripts para instalar scripts ... Acho que não se encaixa no fluxo de trabalho de pip .

Suspeito que seja porque fazemos uma desinstalação e depois uma instalação, em vez de uma instalação substituindo o que está lá (por motivos óbvios).

O Windows não permite sobrescrever ou excluir arquivos exe abertos, mas permite renomeá-los / movê-los.

Bem, com alguma tolice com a API Win32, você pode fechar o identificador para pip.exe mesma forma que você pode ao usar o explorador de processos do Sysinternal.

Eu não acho que você pode fechar todas as alças para o exe atualmente em execução. Mas se você tem um código de trabalho como exemplo, adoraria vê-lo, já que há muito tempo é um problema que as pessoas debatem e o consenso sempre foi de que não é possível (exceto por truques como "renomear e excluir depois" ) O código de trabalho que faz isso seria extremamente útil para a comunidade.

Correr para o mesmo problema.

Como um hack rápido, o pip.exe pode detectar que está sendo atualizado antes da execução e reiniciar-se com python -m pip {{ sys.argv }} ?

Eu não acho que isso realmente funcione.

Mas talvez um pensamento estúpido, afaik o .exe não precisa ser atualizado, podemos apenas colocar pip.exe especial e deixá-lo sozinho? Possivelmente deixaria um pip.exe parado após a instalação.

@dstufft correto, "reiniciar-se" não é tão simples quanto @techtonik faz parecer no Windows, onde não há equivalente da chamada Unix exec .

Tecnicamente, pip.exe pode precisar de atualização se o ponto de entrada for alterado ou se o código do wrapper distlib for alterado. Isso não é comum, mas pode acontecer (no início, o código distlib mudou um pouco até as coisas se acalmarem). O que seria possível fazer seria gravar o novo pip.exe em um local temporário e, se for idêntico ao atual, pule-o. Você não evitaria erros quando precisasse de atualização, mas em 99% dos casos em que não precisava, você estaria bem.

BTW, estamos andando em círculos aqui. De acordo com os comentários anteriores de Vinay, isso é resolvido em distlib (que é onde eu acho que deveria ser resolvido), mas pip não usa a API de uma forma que permita seu funcionamento. Se pudéssemos usar a solução distlib, ótimo. Caso contrário, precisamos de alguém para escrever uma solução específica para o pip (e continuo cético de que isso possa ser feito de uma maneira robusta e sustentável que não seja muito mais complexa do que a questão garante).

Sugestão:

  1. Alguém adiciona uma seção aos documentos do pip em http://www.pip-installer.org/en/latest/installing.html#install-or-upgrade-pip observando que a solução alternativa python -m pip é necessária no Windows ao atualizar o pip com ele mesmo. Eu posso ter a chance de fazer isso em algum momento, mas PRs de pessoas que contribuíram para este problema seriam aceitos com gratidão :-).
  2. Se alguém tiver uma solução viável e estiver preparado para implementá-la, deve levantar um PR e podemos revisar o código real em vez das abordagens propostas.

Acho que estamos no estágio em que o código de trabalho real é a única coisa que vai levar esse problema adiante.

Eu sou -1 em inchar os documentos sem tentar outras soluções.

Eu sou +1 em documentar o que funciona agora.

Mesmo com o comentário de documento, ainda é uma solução alternativa - não uma solução, e você tem o prompt de comando do Windows errado.

Talvez isso seja loucura, mas eu sempre faço isso:

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

claro que isso requer que se tenha libcurl, mas existem binários do Windows disponíveis aqui .

Eu tentei instalar em um Mac, mas recebi este

Alexs-MacBook- Air: Pipmodules aleand $ pip install -U pip
-bash: pip: comando não encontrado
Alexs-MacBook- Air: Pipmodules aleand $ python get-pip.py
Baixando / descompactando pip
Baixando pip-1.5.5-py2.py3-none-any.whl (1,2 MB): 1,2 MB baixado
Instalando pacotes coletados: pip
Limpando...
Exceção:
Traceback (última chamada mais recente):
Arquivo "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/basecommand.py", linha 122, no principal
status = self.run (opções, args)
Arquivo "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/commands/install.py", linha 283, em execução
required_set.install (install_options, global_options, root = options.root_path)
Arquivo "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/req.py", linha 1435, na instalação
required.install (install_options, global_options, _args, * _kwargs)
Arquivo "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/req.py", linha 671, na instalação
self.move_wheel_files (self.source_dir, root = root)
Arquivo "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/req.py", linha 901, em move_wheel_files
pycompile = self.pycompile,
Arquivo "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/wheel.py", linha 215, em move_wheel_files
clobber (fonte, lib_dir, True)
Arquivo "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/wheel.py", linha 205, no clobber
os.makedirs (destdir)
Arquivo "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py", linha 157, em makedirs
mkdir (nome, modo)
OSError: [Errno 13] Permissão negada: '/Library/Python/2.7/site-packages/pip'

Armazenamento de log de depuração para falha em /Users/aleand/Library/Logs/pip.log

@zaducu , posso dizer pelo seu traceback que você está tentando atualizar a versão do pip que está na versão do Python que veio pré-instalada com o seu mac. Já que você está atualizando a versão pré-instalada, você precisará elevar suas credenciais usando sudo :

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

Para usar sudo você deve adicionar a si mesmo a /etc/sudousers . Pesquise no Google e você encontrará vários links que mostram como fazer isso.

Mac é inteligente, ele mantém seus pacotes em /Library/Python vez de corromper sua pasta /System/Frameworks/Python.framework site-pacakges . Yay! Mas para acessar esta pasta, você deve ser um administrador com privilégios de root, portanto sudo .

Uma alternativa a considerar é manter seus pacotes e módulos pessoais separados usando virtualenv e / ou uma pasta .local . Para instalar pacotes em uma pasta local, use distutils vez de pip e siga as instruções de instalação de módulos python .

Outras alternativas para usar o Python pré-instalado são usar Python oficial , homebrew , MacPorts, Fink ou construí-lo você mesmo.

Para Python oficial, você ainda precisará de sudo mas ele instalará a maioria dos itens em /System/Frameworks not /System/Library/Frameworks Para Homebrew, você não deve precisar de sudo . Não posso falar por MacPorts ou Fink.

Ainda tenho o mesmo problema no Windows, atualizando de 1.5.4 para 6.0.8:

E: \ Distrib \ Programming> pip install -U pip
Baixando / descompactando pip em https://pypi.python.org/packages/py2.py3/p/pip/pip-6.0.8-py2.py3-none-any.whl#md5 = 41e73fae2c86ba2270ff51c1d86
f7e09
Instalando pacotes coletados: pip
Instalação existente encontrada: pip 1.5.4
Desinstalando o pip:
Pip desinstalado com sucesso
Limpando...
Exceção:
Traceback (última chamada mais recente):
Arquivo "C: \ Python \ 3.3-32 \ lib \ shutil.py", linha 371, em _rmtree_unsafe
os.unlink (nome completo)
PermissionError: [WinError 5] Отказано в доступе: 'c: \ users \ bialix \ appdata \ local \ temppip-6i_i7a-uninstallpython \ 3.3-32 \ scripts \ p
ip.exe '

Durante o tratamento da exceção acima, outra exceção ocorreu:

Traceback (última chamada mais recente):
Arquivo "C: \ Python \ 3.3-32 \ lib \ site-packagespip \ basecommand.py", linha 122, no principal
write_debug_log = check_path_owner (debug_log_path)
Arquivo "C: \ Python \ 3.3-32 \ lib \ site-packagespip \ comandos \ install.py", linha 283, em execução
build_delete = (não (options.no_clean ou options.build_dir))
Arquivo "C: \ Python \ 3.3-32 \ lib \ site-packagespipreq.py", linha 1443, na instalação
Arquivo "C: \ Python \ 3.3-32 \ lib \ site-packagespipreq.py", linha 610, em commit_uninstall
Arquivo "C: \ Python \ 3.3-32 \ lib \ site-packagespipreq.py", linha 1860, no commit
Arquivo "C: \ Python \ 3.3-32 \ lib \ site-packagespip \ util.py", linha 43, em rmtree
Arquivo "C: \ Python \ 3.3-32 \ lib \ shutil.py", linha 478, em rmtree
return _rmtree_unsafe (caminho, onerror)
Arquivo "C: \ Python \ 3.3-32 \ lib \ shutil.py", linha 368, em _rmtree_unsafe
_rmtree_unsafe (nome completo, onerror)
Arquivo "C: \ Python \ 3.3-32 \ lib \ shutil.py", linha 368, em _rmtree_unsafe
_rmtree_unsafe (fullname, onerror)
Arquivo "C: \ Python \ 3.3-32 \ lib \ shutil.py", linha 368, em _rmtree_unsafe
_rmtree_unsafe (nome completo, onerror)
Arquivo "C: \ Python \ 3.3-32 \ lib \ shutil.py", linha 373, em _rmtree_unsafe
onerror (os.unlink, fullname, sys.exc_info ())
Arquivo "C: \ Python \ 3.3-32 \ lib \ site-packagespip \ util.py", linha 62, em rmtree_errorhandler
PermissionError: [WinError 5] Отказано в доступе: 'c: \ users \ bialix \ appdata \ local \ temppip-6i_i7a-uninstallpython \ 3.3-32 \ scripts \ p
ip.exe '

Alguma mudança neste assunto?

Não pode ser corrigido em nenhum sentido prático (pelo menos, alguém precisaria fornecer um patch funcional completo para avaliação, se pensasse que fosse, já que ninguém ainda descobriu uma maneira de corrigi-lo - é essencialmente uma limitação do Windows).

A maneira correta de atualizar o pip no Windows é python -m pip install -U pip .

@pfmoore E o 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 Sigh. Eu odeio ter que pensar sobre Python 2.6 :-)

Se bem me lembro, python -m pip.__main__ trabalha lá. Não tenho uma cópia do Python 2.6 disponível para testá-lo no momento, desculpe ...

Acabei de testar no Python 2.6 e python -m pip.__main__ realmente funciona lá.

Olá!

python -m pip install -U pip não funciona para mim (w7, powershell, python instalado via chocolatey); a instalação falha com problemas de permissão:

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'

Pensamentos?

Não há como bloquear esse arquivo ou você não deve ter permissão para excluí-lo. Poderia ser um problema de chocolate? Você pode excluir esse arquivo manualmente em um prompt de comando?

@AmazingHorse você já tentou

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

assumindo que você tem cURL ?

Interessante, @pfmoore , esse arquivo está bloqueado até mesmo em um prompt de comando do administrador.

Então, parece um problema de permissão do Windows, em vez de algo com pip.

Isso tem a ver com o fato de que meu python foi instalado fora da estrutura de diretório do Windows em C:?

Estarei pesquisando sobre isso, mas estou curioso para saber se alguém pode postar aqui o que pode ter sido causado por isso.

Saúde Gente

@AmazingHorse Honestamente, não faço ideia. A outra possibilidade é que pode haver algo particular sobre como Chocolatey instala Python - talvez relatar o problema em seu rastreador (presumo que eles tenham um?) E ver o que dizem.

Mas sim, não é um problema pip, pelo que parece.

O Windows permite renomear / mover arquivos mapeados na memória (mapeados como imagem ou dados) para um novo nome no mesmo volume. Portanto, o manipulador de erros rmtree pode tentar renomear o arquivo para movê-lo para o diretório temporário base. Pelo menos aí não vai interferir na remoção do diretório. Esta solução alternativa falhará se o arquivo estiver em um volume diferente do diretório temporário, ou para uma violação de compartilhamento, ou se a ACL do arquivo impedir a operação. Mas nenhum desses deve se aplicar neste caso.

Se o grupo Administradores estiver habilitado no token de processo, o arquivo renomeado pode ser agendado para exclusão quando o sistema for reiniciado. Apenas use ctypes para chamar MoveFileExW(path, None, MOVEFILE_DELAY_UNTIL_REBOOT) . Isso falha para usuários regulares, entretanto, porque eles não têm permissão para modificar o valor de registro PendingFileRenameOperations do gerenciador de sessão.

pip no windows 7/10 funcionando bem, exceto para atualização> pip install --upgrade pip
Tento carregar o mínimo possível no meu C: \ (SSD) e instalar o software na árvore começando em D: \ NUC \
Aqui está o que estou vendo:

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'

O caminho da pasta AppData está disponível na minha unidade D :, perguntando-me a melhor forma de lidar com essa situação para uso e ferramentas subsequentes. Pensei em uma junção, mas ainda assim parecerá uma unidade diferente. Talvez faça o script dos diffs do local esperado para o local real para verificar o caminho correto? Antes de fazer isso, o pip instalou o django perfeitamente (mas reclamou da versão que levou a essa descoberta). hmmm ... e agora pip parece quebrado.

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>

você tem que fazer python.exe -m pip install --upgrade pip

No Python 2.6, você precisa executar python -m pip.__main__ install -U pip

Considero a situação atual muito ruim para novos usuários de Python, bem como para usuários antigos de Python, como eu, que normalmente não usam o Windows. Estou perfeitamente bem usando python -m pip install --upgrade pip , mas realmente acho que pip install --upgrade pip deveria recomendar isso automaticamente no Windows. @dstufft já propôs isso em 2013. Há um bom motivo para não fazer isso?

PS: Desculpe por relatar o nº 3462 como uma duplicata deste problema. Não encontrei esse problema pesquisando WindowsError no rastreador. Esperançosamente, após este comentário, outros no futuro o farão.

Pelo que sei, já é o comando que o pip sugere ao usuário ao detectar uma nova versão de si mesmo. A situação não é tão ruim.

@pekkaklarck O principal motivo para não fazer isso é que é muito difícil de detectar. Para começar, não sei como detectar com segurança que o pip está sendo executado a partir de pip.exe em vez de python -m pip . E mesmo se você detectar isso, você precisa verificar se pip está nas coisas que estão sendo instaladas (considere pip install --upgrade -r http://some.remote/requirements.txt - no momento em que você ler o arquivo de requisitos, é sem dúvida tarde demais para emitir a mensagem).

Claro, algo que não é 100% perfeito é algo totalmente razoável de implementar - é garantir que não nos oponhamos a usos inteiramente válidos, em vez de garantir que pegamos todos os casos esquivos, isso é realmente importante.

Certamente consideraríamos mesclar um PR para resolver esse problema, mas não acho que nenhum dos desenvolvedores de pip principais ache o problema suficientemente problemático para tentar consertá-lo (provavelmente sou o usuário mais pesado do Windows nos desenvolvedores principais, e Acho que lembrar de usar python -m pip razoavelmente fácil).

para fins de descobrir se somos pip[.exe] ou não, imagino

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

funcionaria bem. Além disso, apenas alertar para ver [-U|--upgrade] e pip na invocação provavelmente seria o suficiente para corrigir 90% das invocações.

@stonebig : Você poderia esclarecer quando esse comando é recomendado? Tentei pip install -U pip após uma nova instalação do Python 2.7.11 e falhou com este erro:

WindowsError: [Erro 5] Acesso negado: 'c: \ users \ koulutus \ appdata \ local \ temppip-65z4kx-uninstallpython27 \ scriptspip.exe'

@pfmoore : Atualizar o pip no arquivo de requisitos parece muito raro e provavelmente pode ser ignorado. Como @Ivoz , pensei que pip.exe estaria em sys.argv . Alternativamente, deve ser possível pegar WindowsError e reagir a isso.

@Ivoz isso funciona? Achei que o wrapper pip.exe invocou python como um subprocesso, então não funcionaria. Mas um teste rápido (imprimindo sys.argv[0] em pip.main() ) mostra:

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

Portanto, funciona, mas você precisa ter cuidado ao localizar pip em sys.argv[0] (observe que o primeiro exemplo inclui o diretório pip no caminho para __main__.py )

Obrigado por apontar isso. Aprendi algo hoje :-)

@pekkaklarck O problema em capturar WindowsError (se bem me lembro) é que isso acontece muito tarde, e a instalação está parcialmente completa (e não é fácil reverter).

Mas não quero desencorajar ninguém de tentar corrigir esse problema, então vou deixar assim :-)

mas você precisa ter cuidado ao localizar pip em sys.argv [0]

@pfmoore daí a chamada para os.path.basename .

@Ivoz Sigh. Muito tarde da noite aqui. Sim, obviamente :-)

@pekkaklarck . por exemplo, ao fazer pip list (no Windows). Pelo que me lembro nas discussões do ano passado:

  • esta foi a única solução que a equipe pypa imaginou ser confiável,
  • só é mostrado no windows.

pip_example

Poderia haver uma solução melhor, mas presumo que já seja 80% de uma resposta perfeita da situação anterior.

Talvez uma solução melhor seria ter um "upgrade_pip.bat" entregue com a instalação padrão do Windows em python, não restrito a "pip", e isso faria esse comando. (ou pip_update.bat para melhor corresponder a conda?)

Eu cheguei a isso hoje enquanto mergulhava na experiência do usuário do Windows Python. Foi terrível.
Podemos tornar -m automático para esse comando? (talvez dar ao pip de atualização seu próprio comando?)

Nenhum usuário deveria ter que ver isso, especialmente depois de executar exatamente o comando _pip instruído a executar_.

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

Acho que já temos a configuração de registro em versões mais recentes do pip do que 7.0.1 para dizer aos usuários do Windows para usar python -m pip install --upgrade pip vez de pip install --upgrade pip .

: brilhos:: bolo:: brilhos:

Sim, desde 7.1 cf # 2830

\o/

Não consigo atualizar meu pip no win 10, o que há de errado?

default

@grasx
Se você realmente deseja saber o que há de errado, por favor, leia este tópico. Se você está apenas interessado em fazer isso funcionar, leia a última linha do resultado que você obteve e compare com o que você executou.

@ piotr-dobrogost
É isso? A última linha vermelha parece apontar para um problema de decodificação, e não para o erro de acesso negado que é o resultado normal da atualização local no Windows. O problema de @grasx pode estar relacionado ao uso de uma página de código cirílica?

Duvido que o problema encontrado por @grasx esteja relacionado a esse problema. No entanto, já vi problemas semelhantes no Windows. Consulte # 3463.

@nmusatti
Você está certo. Foi mal.

@ piotr-dobrogost @nmusatti @pekkaklarck No entanto, obrigado, eu mudei o nome do usuário, então agora ele contém apenas caracteres ASCII e atualizou com sucesso o pip para 8.1

@grasx mudou o nome do usuário? Estou confuso com o que você disse ... Eu tive o mesmo problema, algo diferente é que eu estava no windows 7

ideia aleatória, que tal não substituir o arquivo exe se não for necessário

pelo que eu entendi, os arquivos exe são trampolins muito pequenos que normalmente funcionam

a lógica mais importante está nos arquivos de script que os acompanham

@ pzz2011 Bem, na verdade eu reinstalei meu win e defini um novo nome de usuário. Foi mais fácil no meu caso do que descobrir como alterá-lo em todos os locais e rotas onde é mencionado :)

@RonnyPfannschmidt Depende do que é usado para escrever o .exe - ferramentas de configuração usadas para usar foo.exe + foo-script.py (não tenho certeza do que faz agora), enquanto distlib (se estiver configurado) cria um único foo.exe que incorpora o script.

@grasx hhh ... Achei uma maneira mais fácil de resolver. Acabei de reinstalar o python de 2.7.x para 2.7.10.
Então, o sucesso sorriu para mim ~

No Windows, use as janelas do Prompt de Comando no modo Administrador. Então digite o comando
python -m pip install --upgrade pip

Espero que funcione para você. Foi assim que consegui funcionar no Window 10

Boa sorte.

@grasx Não tenho certeza do porquê, mas esse bug surge ao selecionar "instalar para todos os usuários" no instalador Python nas janelas 8.1 e 10. Faça uma reinstalação, selecione PATH e instalação personalizada. Certifique-se de que a caixa superior esteja desmarcada e selecione o local de instalação. Usar "python -m pip install --upgrade pip" no cmd funciona bem depois disso.

Apenas um FYI, para usuários do Windows. Se você instalar o Cygwin, o Python2.7 será instalado automaticamente. Tudo o que você precisa fazer é executar:

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

(Sim, você precisa instalar wget primeiro.)

image
Como resolver este problema?

@ JingY0604
Consulte Para copiar texto de uma janela de prompt de comando para obter uma explicação sobre como copiar texto aqui. Desta forma, o texto que você postar será pesquisável.

Você está usando o pip versão 7.1.0, mas a versão 9.0.1 está disponível.
Você deve considerar a atualização por meio do comm 'python -m pip install --upgrade pip'
e.
D: \ Arquivos de programas \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_vendorrequ
ests \ packages \ urllib3 \ util \ ssl_.py: 90: InsecurePlatformWarning: Um SSLContex verdadeiro
t objeto não está disponível. Isso evita que o urllib3 configure SSL apropriado
ely e pode fazer com que certas conexões SSL falhem. Para obter mais informações, consulte htt
ps: //urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
InsecurePlatformWarning
Coletando pip
Baixando pip-9.0.1-py2.py3-none-any.whl (1,3 MB)
Exceção:
Traceback (última chamada mais recente):
Arquivo "D: \ Arquivos de programas \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ base
command.py ", linha 223, no principal
status = self.run (opções, args)
Arquivo "D: \ Arquivos de programas \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ comm
ands \ install.py ", linha 282, em execução
required_set.prepare_files (localizador)
Arquivo "D: \ Arquivos de programas \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpipreq \
req_set.py ", linha 334, em prepare_files
functools.partial (self._prepare_file, finder))
Arquivo "D: \ Arquivos de programas \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpipreq \
req_set.py ", linha 321, em _walk_req_to_install
more_reqs = handler (req_to_install)
Arquivo "D: \ Arquivos de programas \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpipreq \
req_set.py ", linha 491, em _prepare_file
sessão = self.session)
Arquivo "D: \ Arquivos de programas \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ down
load.py ", linha 825, em unpack_url
sessão,
Arquivo "D: \ Arquivos de programas \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ down
load.py ", linha 673, em unpack_http_url
from_path, content_type = _download_http_url (link, sessão, temp_dir)
Arquivo "D: \ Arquivos de programas \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ down
load.py ", linha 886, em _download_http_url
_download_url (resp, link, content_file)
Arquivo "D: \ Arquivos de programas \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ down
load.py ", linha 621, em _download_url
para pedaço em progress_indicator (resp_read (4096), 4096):
Arquivo "D: \ Arquivos de programas \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ util
s \ ui.py ", linha 135, no iter
self.next (n)
Arquivo "D: \ Arquivos de programas \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ progress__init __. py ", linha 73, no próximo
self.update ()
Arquivo "D: \ Arquivos de programas \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ progress \ bar.py ", linha 82, em atualização
self.writeln (linha)
Arquivo "D: \ Arquivos de programas \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ progress \ helpers.py ", linha 69, em writeln
imprimir (linha, fim = '', arquivo = self.file)
Arquivo "D: \ Arquivos de programas \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ colorama \ ansitowin32.py ", linha 133, por escrito
self.write_and_convert (texto)
Arquivo "D: \ Arquivos de programas \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ colorama \ ansitowin32.py ", linha 161, em write_and_convert
self.write_plain_text (texto, cursor, len (texto))
Arquivo "D: \ Arquivos de programas \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ colorama \ ansitowin32.py ", linha 166, em write_plain_text
self.wrapped.write (texto [início: fim])
UnicodeEncodeError: o codec 'ascii' não pode codificar o caractere u '\ u258f' na posição 8
: ordinal fora do intervalo (128)

@ JingY0604 Consulte # 3463.

Você pode atualizar seu pip desinstalando a instalação existente e usando get-pip.py para instalar a versão mais recente.

Para https://github.com/ofek/hatch , acabei de pegar todas as instâncias de atualização e não permitir. Eu então tenho um sinalizador --self explícito para fazer popens a python -m pip install -U hatch e sair imediatamente.

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

editar: tecnicamente, em vez de apenas python , sys.executable é usado na verdade

@ofek # 4490 fez uma mudança no pip, imprimindo uma mensagem melhor, IIRC.

Então, por enquanto, se eu instalei o python sem pip, não poderei instalar o módulo pip no 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

Ei @ihormelnyk!

Esse não é o caso. A condicional para isso era muito ampla - bloqueia o uso de qualquer script com a palavra "pip" para modificar o pip. Você pode tentar renomear get-pip.py para não conter a palavra "pip", para contornar esse problema.

Uma versão 10.0.1 (que provavelmente acontecerá esta semana) corrigirá esse problema.

@pradyunsg obrigado por compartilhar a dica. Eu tive o mesmo problema que @ihormelnyk e renomear o arquivo get-pip.py para um nome que não contém a palavra pip ajudou.

Eu imprimo pip em cmd nas janelas, mas mostrou
Erro fatal no inicializador: Não foi possível criar o processo usando '"" d: \ arquivos de programas (x86) python3.6python.exe "" D: \ Arquivos de programas (x86) python3.6 \ Scriptspip.exe "'
Já configurei o ambiente para o pip, mas não funciona, como faço para descobrir?

@ BJQ98 Você gostaria de dar uma olhada em # 5223.

pradyunsg disse que 10.0.1 resolveria isso, mas não sei como. Obrigado.

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á o mesmo que # 5343.

Obrigado pradyunsg, a solução de outra pessoa acabou sendo mais simples. Acabei de executar "python -m pip desinstalar pip" primeiro, depois "python -m pip install -U pip"

Requisito já atualizado: pip em 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.

Estou recebendo um erro ao executar o comando acima como um erro de sintaxe para a palavra get, o que pode ser a solução para isso

@AProNoob Você deve executar os comandos em um prompt de comando (cmd ou powershell), não em um prompt Python.

Obrigado! Isso funcionou!

Este tópico foi bloqueado automaticamente, pois não houve nenhuma atividade recente após seu encerramento. Abra um novo problema para bugs relacionados.

Esta página foi útil?
0 / 5 - 0 avaliações