Pip: обновления окон на месте

Созданный на 5 нояб. 2013  ·  89Комментарии  ·  Источник: pypa/pip

не уверен в статусе pip install --ugrade pip в окнах.

это нужно для PEP453

@pfmoore ?

см. # 188 для более старого обсуждения этого.

windows auto-locked bug

Самый полезный комментарий

В Windows используйте окна командной строки в режиме администратора. Затем введите команду
python -m pip install --upgrade pip

Надеюсь, это сработает для вас. Вот как я заставил его работать в Window 10

Удачи.

Все 89 Комментарий

Используйте python -m pip install --upgrade pip . Я думаю, что @vsajip рассматривал некоторую форму магии в оболочках exe, чтобы означать, что самостоятельная замена exe может работать. Но я не знаю, делал ли он что-нибудь в той версии distlib, которую мы используем. На самом деле я не уверен, что это можно было бы сделать без помощи приложения (pip). И я почти уверен, что для этого в pip не было добавлено никакого кода.

Лично я считаю, что это незначительная проблема - совет людям использовать python -m pip кажется мне вполне приемлемым ответом, учитывая, что проблема является фундаментальной для того, как Windows обрабатывает удаление открытых файлов.

В конечном итоге это будет вопрос о том, насколько сложно (с вытекающими отсюда затратами на обслуживание) и рисками, которые мы хотим принять, чтобы решить эту проблему.

Лично меня устраивает, что pip install --upgrade pip печатает сообщение, чтобы использовать python -m pip install --upgrade pip . Я просто не думаю, что мы должны выдавать ошибку об открытых дескрипторах файлов или о другом исключении.

Я как раз собирался сказать то же самое.

Вот вопрос: хотите ли вы, чтобы это сообщение отображалось только в Windows, или было бы разумно сказать то же самое в Unix (для единообразного взаимодействия с пользователем). Лично я хотел бы быть последовательным на разных платформах (потому что так легче документировать).

Кроме того, мы должны перехватить любую команду, которая пытается (пере) установить pip - например, pip install -I pip .

Лично я считаю, что это должны быть только окна. Я рассматриваю это как обходной путь работы платформы Windows и что-то, что в конечном итоге нужно удалить для чего-то более приятного в будущем.

Я знал, что ты это скажешь :-(

Откровенно говоря, я не верю, что мы когда-нибудь получим «что-то более хорошее», в основном потому, что у нас недостаточно опыта в Windows для его разработки и поддержки. Я не знаю _не_ программного обеспечения Windows с удовлетворительной самостоятельной заменой исполняемых файлов. У меня, конечно, нет ответа, и я не ожидал, что кто-либо из разработчиков, работающих под Unix, сможет мне помочь. Даже если мы что-то получим, это, вероятно, будет сложным и поэтому вероятным источником гнили и неясных ошибок.

Мне кажется, что создание решения, которое работает на всех платформах, «официальный ответ» позволяет избежать отправки пользователю запутанных сообщений. Сделайте резервную копию предупреждения, как описано, и у нас есть надежное решение, даже если оно не так идеально, как заставить работать pip install -U pip .

Пожалуйста, извините за некоторую степень легкого ворчания в этом ответе, вызванную ощущением, что компромисс всегда должен быть на платформе Windows - я не хочу делать из этого проблему. На практике я буду придерживаться любого консенсуса. Я не думаю, что это большое дело.

FWIW моя цель после того, как PEP453 будет завершена, - создать нашу собственную инфраструктуру тестирования, которая включает Windows, так что, надеюсь, это решит некоторые проблемы Windows Bitrot.

Хотя я могу понять сварливость :) Если бы мы разрабатывали эту систему совершенно новой, я бы гораздо более поправился, но я не думаю, что удобно для пользователя сломать pip install -U pip для всего, что не Windows, чтобы поддерживать последовательность. Если бы это было что-то новое, то у пользователей нет (или, по крайней мере, меньше) ожиданий:]

Хорошо, звучит справедливо. Вы правы, здесь важнее историческое употребление.

На самом деле я совершенно не чувствую, что такое пользовательский опыт в Unix, поэтому я, вероятно, так же виноват в одностороннем мышлении, как и все остальные. Я должен попытаться понять, как себя чувствует использование Python в Linux - есть ли хороший ресурс «Python в Linux для начинающих», который показывает, как настроить среду Python (3), настроить различные инструменты и т. Д.? [Одна вещь, которую я всегда нахожу не охваченной, это то, как заставить "python" запускать Python 3 по умолчанию, как заставить "virtualenv" по умолчанию строить виртуальные серверы Python 3, и все такое - мне кажется, что Python 3, как ни странно, гораздо более второсортный в Unix, чем в Windows.]

Обычно вы не хотите, чтобы python указывало на python3 на * nix, потому что система использует Python и не все их библиотеки будут перенесены на Python3. Однако есть некоторые дистрибутивы Linux, в которых Python3 теперь используется по умолчанию ... Думаю, Arch? А может, следующая Fedora?

Хм, я не говорю о системном уровне, но неужели вы не можете выбрать, что использовать для Python в личном кабинете? Это определенно делает Python 3 второсортным, на мой взгляд ... Но это объясняет, почему пользователи Unix, похоже, не находят использование таких вещей, как "pip3" или "pip3.3" таким же уродливым, как и грех :-)

(Во всяком случае, мы здесь не по теме, так что неважно).

Вы можете настроить свою оболочку так, чтобы она была ~ / bin / перед системным bin, и добавить туда символическую ссылку с python на python3, но да оффтоп. Я рад помочь, если вы действительно заинтересованы в настройке:] IRC или электронная почта.

Моя работа, о которой, как мне кажется, имел в виду Пол, заключалась в том, чтобы просто реализовать танец «deleteme» для замены используемых файлов (то есть оболочек exe) - это в коде distlib Python, а не в оболочках .exe. Он находится в модуле distlib.scripts и должен выполняться всякий раз, когда этот модуль используется для создания сценария.

Так, может быть, это уже решено для Wheels? А иначе это проблема с setuptools?

Звучит возможно. Я сделаю несколько тестов сегодня, если смогу.

К сожалению, нет, по крайней мере, с "pip install -I pip". (Трудно протестировать фактическое обновление, поскольку только самая последняя версия pip имеет поддержку оболочки сценария):

>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

Итак, pip не использует distlib.scripts для установки скриптов ... Я думаю, это не вписывается в рабочий процесс pip .

Я подозреваю, что это потому, что мы выполняем удаление, а затем установку, а не установку, перезаписывающую то, что есть (по очевидным причинам).

Windows не позволяет перезаписывать или удалять открытые exe-файлы, но позволяет переименовывать / перемещать их.

Что ж, с помощью некоторого дурачества с Win32 API вы можете закрыть дескриптор pip.exe же, как вы можете использовать проводник процессов Sysinternal.

Я не думаю, что вы можете закрыть все дескрипторы исполняемого в данный момент exe. Но если у вас есть рабочий код в качестве примера, я бы хотел его увидеть, так как это уже давно проблема, которую люди обсуждают, и всегда был консенсус, что это невозможно (за исключением уловок типа «переименовать и удалить позже» ). Рабочий код, который делает это, был бы чрезвычайно полезен сообществу.

Столкнитесь с той же проблемой.

В качестве быстрого взлома может ли pip.exe обнаружить, что он обновляется до выполнения, и перезапустить себя с помощью python -m pip {{ sys.argv }} ?

Я не думаю, что это действительно работает.

Но, может быть, глупая мысль, ведь .exe не нужно обновлять, можем ли мы просто специальный случай pip.exe и оставить его в покое? Возможно, после установки останется pip.exe.

@dstufft правильно, «перезагрузить себя» не так просто, как @techtonik говорит об этом в Windows, где нет эквивалента вызова exec в Unix.

Технически pip.exe может нуждаться в обновлении при изменении точки входа или при изменении кода оболочки distlib. Это нечасто, но может случиться (на раннем этапе код distlib немного изменился, пока все не успокоилось). Что можно сделать, так это записать новый pip.exe во временное место, а затем, если он идентичен текущему, пропустить его. Вы не избежали бы ошибок, когда он действительно нуждался в обновлении, но в 99% случаев, когда этого не произошло, все будет в порядке.

Кстати, мы здесь ходим по кругу. Согласно предыдущим комментариям Виная, это решается в distlib (где, я думаю, это должно быть решено), но pip не использует API таким образом, чтобы он мог работать. Если бы мы могли использовать решение distlib, тогда отлично. В противном случае нам нужен кто-то, кто бы написал решение для конкретного пакета (и я по-прежнему скептически отношусь к тому, что это можно сделать надежным, поддерживаемым способом, который не намного сложнее, чем требует проблема).

Предложение:

  1. Кто-то добавляет раздел в pip docs по адресу http://www.pip-installer.org/en/latest/installing.html#install-or-upgrade-pip, отметив, что обходной путь python -m pip необходим в Windows при обновлении пункта с самим собой. В какой-то момент у меня может быть шанс сделать это, но PR от людей, которые внесли свой вклад в эту проблему, будут с благодарностью приняты :-).
  2. Если у кого-то есть жизнеспособное решение и он готов его внедрить, он должен поднять PR, и мы сможем рассмотреть фактический код, а не предлагаемые подходы.

Я думаю, что мы находимся на стадии, когда фактический рабочий код - единственное, что может продвинуть эту проблему вперед.

Я -1 за раздувание документов, не пробуя другие решения.

Я +1 за документирование того, что работает прямо сейчас.

Даже с комментарием документа это все еще обходной путь - не решение, и у вас неправильная командная строка для Windows.

Может быть, это безумие, но я всегда так делаю:

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

это , конечно , требует, чтобы иметь Libcurl, но есть окна исполняемые файлы доступны здесь .

Я пытался установить его на Mac, но получил это

Alexs-MacBook- Air: pipmodules aleand $ pip install -U pip
-bash: pip: команда не найдена
Alexs-MacBook- Air: модули pipmodules aleand $ python get-pip.py
Скачивание / распаковка pip
Загрузка pip-1.5.5-py2.py3-none-any.whl (1,2 МБ): загружено 1,2 МБ
Установка собранных пакетов: pip
Убираться...
Исключение:
Отслеживание (последний вызов последний):
Файл "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/basecommand.py", строка 122, в основном
status = self.run (параметры, аргументы)
Файл "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/commands/install.py", строка 283, в процессе
required_set.install (install_options, global_options, root = options.root_path)
Файл "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/req.py", строка 1435, в установке
required.install (параметры_установки, глобальные_опции, _args, * _kwargs)
Файл "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/req.py", строка 671, в установке
self.move_wheel_files (self.source_dir, корень = корень)
Файл "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/req.py", строка 901, в move_wheel_files
pycompile = self.pycompile,
Файл "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/wheel.py", строка 215, в move_wheel_files
clobber (источник, lib_dir, True)
Файл "/var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/wheel.py", строка 205, в clobber
os.makedirs (destdir)
Файл "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py", строка 157, в македирс
mkdir (имя, режим)
OSError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/pip'

Сохранение журнала отладки на случай сбоя в /Users/aleand/Library/Logs/pip.log

@zaducu , я могу сказать из вашей трассировки, что вы пытаетесь обновить версию pip, которая находится в версии Python, которая была предварительно установлена ​​с вашим Mac. Поскольку вы обновляете предустановленную версию, вам нужно будет повысить свои учетные данные с помощью sudo :

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

Чтобы использовать sudo , возможно, вам придется добавить себя в /etc/sudousers . Погуглите, и вы найдете множество ссылок, показывающих, как это сделать.

Mac умен, он хранит ваши пакеты в /Library/Python вместо того, чтобы портить вашу папку /System/Frameworks/Python.framework site-pacakges . Ура! Но для доступа к этой папке вы должны быть администратором с правами root, поэтому sudo .

Альтернативный вариант - разделить ваши личные пакеты и модули с помощью virtualenv и / или папки .local . Чтобы установить пакеты в локальную папку, используйте distutils вместо pip и следуйте инструкциям по установке модулей Python .

Другие альтернативы использованию предустановленного Python - использование официального Python , homebrew , MacPorts, Fink или самостоятельная сборка.

Для официального Python вам все равно понадобится sudo но он установит большинство элементов в /System/Frameworks не в /System/Library/Frameworks Для Homebrew вам не понадобится sudo . Не могу говорить о MacPorts или Fink.

Все еще та же проблема в Windows при обновлении с 1.5.4 до 6.0.8:

E: \ Distrib \ Programming> pip install -U pip
Загрузка / распаковка pip с https://pypi.python.org/packages/py2.py3/p/pip/pip-6.0.8-py2.py3-none-any.whl#md5 = 41e73fae2c86ba2270ff51c1d86
f7e09
Установка собранных пакетов: pip
Найдена существующая установка: pip 1.5.4
Удаление пипса:
Пип успешно удален
Убираться...
Исключение:
Отслеживание (последний вызов последний):
Файл "C: \ Python \ 3.3-32 \ lib \ shutil.py", строка 371, в _rmtree_unsafe
os.unlink (полное имя)
PermissionError: [WinError 5] Отказано в доступе: 'c: \ users \ bialix \ appdata \ local \ temppip-6i_i7a-uninstallpython \ 3.3-32 \ scripts \ p
ip.exe '

Во время обработки вышеуказанного исключения произошло другое исключение:

Отслеживание (последний вызов последний):
Файл "C: \ Python \ 3.3-32 \ lib \ site-packagespip \ basecommand.py", строка 122, в основном
write_debug_log = check_path_owner (debug_log_path)
Файл "C: \ Python \ 3.3-32 \ lib \ site-packagespip \ commands \ install.py", строка 283, выполняется
build_delete = (не (options.no_clean или options.build_dir))
Файл "C: \ Python \ 3.3-32 \ lib \ site-packagespipreq.py", строка 1443, в установке
Файл "C: \ Python \ 3.3-32 \ lib \ site-packagespipreq.py", строка 610, в commit_uninstall
Файл "C: \ Python \ 3.3-32 \ lib \ site-packagespipreq.py", строка 1860, в фиксации
Файл "C: \ Python \ 3.3-32 \ lib \ site-packagespip \ util.py", строка 43, в rmtree
Файл "C: \ Python \ 3.3-32 \ lib \ shutil.py", строка 478, в rmtree
return _rmtree_unsafe (путь, ошибка)
Файл "C: \ Python \ 3.3-32 \ lib \ shutil.py", строка 368, в _rmtree_unsafe
_rmtree_unsafe (полное имя, ошибка)
Файл "C: \ Python \ 3.3-32 \ lib \ shutil.py", строка 368, в _rmtree_unsafe
_rmtree_unsafe (полное имя, ошибка)
Файл "C: \ Python \ 3.3-32 \ lib \ shutil.py", строка 368, в _rmtree_unsafe
_rmtree_unsafe (полное имя, ошибка)
Файл "C: \ Python \ 3.3-32 \ lib \ shutil.py", строка 373, в _rmtree_unsafe
onerror (os.unlink, полное имя, sys.exc_info ())
Файл "C: \ Python \ 3.3-32 \ lib \ site-packagespip \ util.py", строка 62, в rmtree_errorhandler
PermissionError: [WinError 5] Отказано в доступе: 'c: \ users \ bialix \ appdata \ local \ temppip-6i_i7a-uninstallpython \ 3.3-32 \ scripts \ p
ip.exe '

Какие-нибудь изменения по этому поводу?

Это не исправимо в каком-либо практическом смысле (по крайней мере, кому-то нужно было бы предоставить полный рабочий патч для оценки, если бы они думали, что это так, поскольку никто еще не придумал способ исправить это - по сути, это ограничение Windows).

Правильный способ обновления pip в Windows - python -m pip install -U pip .

@pfmoore А что насчет 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 Вздох. Ненавижу думать о Python 2.6 :-)

Если я помню, там работает python -m pip.__main__ . У меня сейчас нет копии Python 2.6, чтобы протестировать ее, извините ...

Я только что протестировал Python 2.6, и python -m pip.__main__ действительно там работает.

Здравствуйте!

python -m pip install -U pip у меня не работает (w7, powershell, установленный python через шоколадный); установка не выполняется из-за проблем с разрешением:

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'

Мысли?

Этот файл никоим образом не должен быть заблокирован или у вас не должно быть разрешения на его удаление. Может быть, проблема в шоколаде? Можете ли вы удалить этот файл вручную из командной строки?

@AmazingHorse ты пробовал?

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

предполагая, что у вас есть cURL ?

Интересно, что @pfmoore , этот файл заблокирован даже в командной строке администратора.

Итак, похоже, что проблема с разрешениями Windows, а не с пипсом.

Связано ли это с тем, что мой питон был установлен вне структуры каталогов Windows в C:?

Я буду гуглить, но мне любопытно, может ли кто-нибудь опубликовать здесь, чем, по их мнению, может быть это вызвано.

Ура, ребята

@AmazingHorse Честно говоря, понятия не имею. Другая возможность заключается в том, что может быть что-то особенное в том, как Chocolatey устанавливает Python - возможно, сообщите о проблеме на своем трекере (я полагаю, он у них есть?) И посмотрите, что они говорят.

Но да, судя по всему, это не проблема.

Windows позволяет переименовывать / перемещать файлы с отображением памяти (отображаемые как изображения или данные) с новым именем на том же томе. Таким образом, обработчик ошибок rmtree может попробовать переименовать файл, чтобы переместить его в базовый временный каталог. По крайней мере там это не помешает удалению каталога. Этот обходной путь не работает, если файл находится на другом томе, чем временный каталог, или из-за нарушения совместного доступа, или если ACL файла препятствует операции. Но ничего из этого не должно применяться в данном случае.

Если в токене процесса включена группа «Администраторы», то переименованный файл можно запланировать для удаления при перезапуске системы. Просто используйте ctypes для вызова MoveFileExW(path, None, MOVEFILE_DELAY_UNTIL_REBOOT) . Однако это не подходит для обычных пользователей, поскольку им не разрешено изменять значение реестра PendingFileRenameOperations диспетчера сеансов.

pip на Windows 7/10 работает нормально, за исключением обновления> pip install --upgrade pip
Я пытаюсь загрузить как можно меньше на мой C: \ (SSD) и установить программное обеспечение в дерево, начиная с D: \ NUC \
Вот что я вижу:

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'

Путь к папке AppData доступен на моем диске D :, и мне интересно, как лучше всего справиться с этой ситуацией для последующих инструментов и использования. Думал о перекрестке, но все равно будет казаться другим диском. Может быть, запишите разницу между ожидаемым и фактическим местоположением, чтобы проверить правильный путь? Прежде чем сделать это, pip просто установил django (но пожаловался на версию, которая привела к этому открытию). хммм ... а теперь пип кажется сломанным.

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>

вам нужно сделать python.exe -m pip install --upgrade pip

На Python 2.6 вам нужно запустить python -m pip.__main__ install -U pip

Я считаю, что текущая ситуация действительно плохая для новых пользователей Python, а также для старых пользователей Python, таких как я, которые обычно не используют Windows. Хотя я прекрасно использую python -m pip install --upgrade pip , но я действительно думаю, что pip install --upgrade pip должен автоматически рекомендовать это в Windows. @dstufft предложил это еще в 2013 году. Есть ли веская причина не делать этого?

PS: извините за сообщение № 3462 как дубликат этой проблемы. Я не нашел эту проблему, выполнив поиск в трекере WindowsError . Надеюсь, после этого комментария в будущем появятся и другие.

Насколько мне известно, это уже та команда, которую pip предлагает пользователю при обнаружении новой версии самого себя. Ситуация не так уж и плоха.

@pekkaklarck Основная причина, по которой этого не делают, заключается в том, что это действительно сложно заметить. Для начала, я не знаю, как надежно определить, что pip запускается из pip.exe а не из python -m pip . И даже если вы это обнаружите, вам нужно проверить, есть ли pip в устанавливаемых вещах (рассмотрите pip install --upgrade -r http://some.remote/requirements.txt - к тому времени, когда вы прочитаете файл требований, возможно, уже слишком поздно выпускать сообщение).

Конечно, то, что не является идеальным на 100%, вполне разумно реализовать - это убедиться, что мы не возражаем против полностью допустимого использования, вместо того, чтобы следить за всеми остальными случаями, что действительно важно.

Мы определенно рассмотрим объединение PR для решения этой проблемы, но я не думаю, что кто-либо из основных разработчиков pip сочтет проблему достаточно проблематичной, чтобы попытаться исправить самостоятельно (я, вероятно, самый тяжелый пользователь Windows среди основных разработчиков, и Я считаю, что вспомнить использование python -m pip довольно просто).

я полагаю, чтобы определить, являемся ли мы pip[.exe] или нет

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

будет работать нормально. Также простого предупреждения о том, что в вызове [-U|--upgrade] и pip , вероятно, будет достаточно, чтобы исправить 90% вызовов.

@stonebig : Не могли бы вы пояснить, когда рекомендуется использовать эту команду? Я попробовал pip install -U pip после новой установки Python 2.7.11, и это не удалось с этой ошибкой:

WindowsError: [Ошибка 5] Отказано в доступе: 'c: \ users \ koulutus \ appdata \ local \ temppip-65z4kx-uninstallpython27 \ scriptspip.exe'

@pfmoore : Обновление pip в файле требований звучит довольно редко и, вероятно, его можно игнорировать. Как и @Ivoz, я думал, что pip.exe будет в sys.argv . В качестве альтернативы должна быть возможность поймать WindowsError и отреагировать на это.

@Ivoz это работает? Я думал, что оболочка pip.exe вызывает python как подпроцесс, поэтому это не сработает. Но быстрый тест (вывод sys.argv[0] в pip.main() ) показывает:

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

Итак, это работает, но вы должны быть осторожны при обнаружении pip в sys.argv[0] (обратите внимание, что первый пример включает каталог pip в путь к __main__.py )

Спасибо за указание на это. Я кое-что узнал сегодня :-)

@pekkaklarck Проблема с WindowsError (если я помню) в том, что это происходит довольно поздно, а установка является частично завершенной (и ее нелегко откатить).

Но я не хочу никого отговаривать от попытки решить эту проблему, поэтому оставлю все как есть :-)

но вы должны быть осторожны при обнаружении pip в sys.argv [0]

@pfmoore отсюда и вызов os.path.basename .

@Ivoz Вздох. Здесь слишком поздно ночью. Да, очевидно :-)

@pekkaklarck . например, при выполнении pip list (в Windows). Насколько я помню, в прошлогодних дискуссиях:

  • это было единственное решение, которое команда pypa считала надежным,
  • он отображается только в окнах.

pip_example

Может быть лучшее решение, но я предполагаю, что это уже 80% идеального ответа из предыдущей ситуации.

Возможно, лучшим решением было бы иметь "upgrade_pip.bat", поставляемый с установкой Windows по умолчанию на python, не привязанный к "pip", и это будет выполнять эту команду. (или pip_update.bat чтобы лучше соответствовать conda?)

Я коснулся этого сегодня, когда погрузился в новый пользовательский интерфейс Windows Python. Это было ужасно.
Можем ли мы сделать -m автоматическим для этой команды? (возможно, дайте обновлению pip собственную команду?)

Ни один пользователь никогда не должен это видеть, особенно после того, как он выполнил именно ту команду, которую _pip сказал им запустить_.

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

Я думаю, у нас уже есть настройка ведения журнала в более поздних версиях pip, чем 7.0.1, чтобы пользователи Windows использовали python -m pip install --upgrade pip вместо pip install --upgrade pip .

: блестки:: торт:: блестки:

Да, начиная с версии 7.1 cf # 2830

\ O /

Я не могу обновить свой пип на выигрыше 10, что не так?

default

@grasx
Если вы действительно хотите знать, что не так, прочтите эту ветку. Если вы заинтересованы только в том, чтобы это работало, прочтите последнюю строку из полученных вами результатов и сравните ее с тем, что вы запустили.

@ piotr-dobrogost
Это? Последняя красная линия, похоже, указывает на проблему декодирования, а не на ошибку отказа в доступе, которая является обычным результатом обновления на месте в Windows. Может ли проблема @grasx быть связана с использованием кириллической кодовой страницы?

Я сомневаюсь, что проблема @grasx связана с этой проблемой. Хотя я видел похожие проблемы в Windows. См. №3463.

@nmusatti
Ты прав. Виноват.

@ piotr-dobrogost @nmusatti @pekkaklarck Однако, спасибо, я изменил имя пользователя, поэтому теперь оно содержит только символы ASCII и успешно обновлено до версии 8.1

@grasx изменил имя пользователя? Я запутался в том, что вы сказали ... У меня такая же проблема, разница в том, что я был в Windows 7

случайная идея, как насчет того, чтобы не заменять exe-файл, если он не нужен

насколько я понял, exe-файлы - это очень маленькие батуты, которые обычно работают

более важная логика находится в сопровождающих файлах сценария

@ pzz2011 Ну, вообще-то я переустановил свой выигрыш и установил новое имя пользователя. Тогда в моем случае было проще узнать, как его поменять во всех местах и ​​на всех маршрутах, где это упоминается :)

@RonnyPfannschmidt Зависит от того, что используется для записи .exe - setuptools, используемые для использования foo.exe + foo-script.py (не уверен, что он делает сейчас), тогда как distlib (если он настроен) создает один foo.exe который встраивает скрипт.

@grasx ххх ... Я нашел более простой способ решить эту проблему. Я просто переустанавливаю питон с 2.7.x на 2.7.10.
Тогда успех улыбнется мне ~

В Windows используйте окна командной строки в режиме администратора. Затем введите команду
python -m pip install --upgrade pip

Надеюсь, это сработает для вас. Вот как я заставил его работать в Window 10

Удачи.

@grasx Не совсем уверен, почему, но эта ошибка возникает при выборе «установить для всех пользователей» в установщике Python как в Windows 8.1, так и в 10. Выполните переустановку, выберите ПУТЬ и выборочную установку. Убедитесь, что верхний флажок не установлен, и выберите место для установки. После этого можно использовать команду python -m pip install --upgrade pip в cmd.

Просто к сведению, для пользователей Windows. Если вы устанавливаете Cygwin, Python2.7 устанавливается автоматически. Все, что вам нужно сделать, это запустить:

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

(Да, сначала нужно установить wget .)

image
Как решить эту проблему?

@ JingY0604
См. Раздел Копирование текста из окна командной строки для объяснения того, как скопировать текст сюда. Таким образом, текст, который вы публикуете, будет доступен для поиска.

Вы используете версию 7.1.0, но доступна версия 9.0.1.
Вам следует рассмотреть возможность обновления с помощью команды python -m pip install --upgrade pip.
и.
D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_vendorrequ
ests \ packages \ urllib3 \ util \ ssl_.py: 90: InsecurePlatformWarning: настоящий SSLContex
t объект недоступен. Это предотвращает настройку urllib3 соответствующего SSL.
ely и может привести к сбою определенных SSL-соединений. Для получения дополнительной информации см. Htt
ps: //urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
InsecurePlatformWarning
Сбор пипса
Скачивание pip-9.0.1-py2.py3-none-any.whl (1,3 МБ)
Исключение:
Отслеживание (последний вызов последний):
Файл "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ base
command.py ", строка 223, в основном
status = self.run (параметры, аргументы)
Файл "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ comm
ands \ install.py ", строка 282, выполняется
required_set.prepare_files (искатель)
Файл "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpipreq \
req_set.py ", строка 334, в prepare_files
functools.partial (self._prepare_file, finder))
Файл "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpipreq \
req_set.py ", строка 321, в _walk_req_to_install
more_reqs = обработчик (req_to_install)
Файл "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpipreq \
req_set.py ", строка 491, в _prepare_file
сессия = self.session)
Файл "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ down
load.py ", строка 825, в unpack_url
сессия
Файл "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ down
load.py ", строка 673, в unpack_http_url
from_path, content_type = _download_http_url (ссылка, сеанс, temp_dir)
Файл "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ down
load.py ", строка 886, в _download_http_url
_download_url (соответственно, ссылка, файл_содержимого)
Файл "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ down
load.py ", строка 621, в _download_url
для фрагмента в progress_indicator (resp_read (4096), 4096):
Файл "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ util
s \ ui.py ", строка 135, in iter
self.next (n)
Файл "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ progress__init __. py ", строка 73, в следующем
self.update ()
Файл "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ progress \ bar.py ", строка 82, в обновлении
self.writeln (строка)
Файл "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ progress \ helpers.py ", строка 69, в Writeln
print (строка, конец = '', file = self.file)
Файл "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ colorama \ ansitowin32.py ", строка 133, записать
self.write_and_convert (текст)
Файл "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ colorama \ ansitowin32.py ", строка 161, в write_and_convert
self.write_plain_text (текст, курсор, len (текст))
Файл "D: \ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_ven
dor \ colorama \ ansitowin32.py ", строка 166, в write_plain_text
self.wrapped.write (текст [начало: конец])
UnicodeEncodeError: кодек ascii не может кодировать символ u '\ u258f' в позиции 8
: порядковый номер вне диапазона (128)

@ JingY0604 См.

Вы можете обновить свой pip, удалив существующую установку и используя get-pip.py для установки более новой версии.

Для https://github.com/ofek/hatch я просто перехватываю все экземпляры обновления себя и запрещаю это. Затем у меня есть явный флаг --self, чтобы он открывал python -m pip install -U hatch и немедленно выходил.

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

изменить: технически вместо python самом деле используется sys.executable

@ofek # 4490 внес изменения в pip,

Итак, если я установил Python без pip, я не смогу установить модуль pip в будущем?

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

Привет, @ihormelnyk!

Это не так. Условие для этого было слишком широким - оно блокирует использование любого скрипта со словом «pip» от изменения pip. Вы можете попробовать переименовать get-pip.py, чтобы он не содержал слово «pip», чтобы обойти эту проблему.

Выпуск 10.0.1 (который, скорее всего, выйдет на этой неделе) исправит эту проблему.

@pradyunsg спасибо, что поделился @ihormelnyk, и переименование файла get-pip.py на имя, не содержащее слова pip помогло.

Я печатаю pip в cmd в Windows, но он показал
Неустранимая ошибка в программе запуска: невозможно создать процесс с помощью '"" d: \ program files (x86) python3.6python.exe "" D: \ Program Files (x86) python3.6 \ Scriptspip.exe "'
Я уже установил среду для pip, но она не работает, как это понять?

@ BJQ98 Вы бы хотели посмотреть на # 5223.

pradyunsg сказал, что 10.0.1 исправит это, но я не знаю как. Благодарю.

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.

Это будет то же самое, что # 5343.

Спасибо pradyunsg, Чужое решение оказывается попроще. Просто выполнил сначала «python -m pip uninstall pip», затем «python -m pip install -U pip»

Требование уже обновлено: pip в 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.

Я получаю сообщение об ошибке при выполнении указанной выше команды как синтаксическая ошибка для слова, которое может быть решением для этого

@AProNoob Вы должны запускать команды из командной строки (cmd или powershell), а не из командной строки Python.

Благодаря! Это сработало!

Этот поток был автоматически заблокирован, поскольку после его закрытия в последнее время не было никаких действий. Пожалуйста, откройте новую проблему для связанных ошибок.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги