Pip: Windows就地点子升级

创建于 2013-11-05  ·  89评论  ·  资料来源: pypa/pip

不确定Windows上pip install --ugrade pip状态。

需要PEP453

@pfmoore

有关此问题的旧讨论,请参见#188。

windows auto-locked bug

最有用的评论

在Windows上,在管理员模式下使用命令提示符窗口。 然后输入命令
python -m pip install-升级pip

我希望这个对你有用。 这就是我让它在Window 10上工作的方式

祝好运。

所有89条评论

使用python -m pip install --upgrade pip 。 我认为@vsajip正在考虑exe包装中的某种形式的魔术,以表示可以自行替换exe。 但是我不知道他是否在我们使用的distlib版本中执行了任何操作。 我实际上不确定在没有应用程序(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专业知识来开发和维护它。 我知道具有令人满意的自我替代可执行文件解决方案的_no_ Windows软件。 我当然没有答案,并且我不希望任何基于Unix的开发人员能够提供帮助。 即使我们确实得到了一些东西,它也可能很复杂,因此很可能会产生一些腐烂和隐蔽的错误。

在我看来,使解决方案在所有平台上均有效,可以避免向用户发送混乱的消息。 像上面描述的那样用警告进行备份,我们有一个可靠的解决方案,即使它不如让pip install -U pip能够正常工作那样完美。

请原谅一定程度的脾气暴躁,这是因为感觉总是必须要折衷的是Windows平台-我并不是要为此出任何问题。 在实践中,无论共识如何,我都会坚持下去。 我认为这没什么大不了的。

FWIW完成PEP453之后,我的目标是建立包括Windows在内的我们自己的测试基础结构,因此希望能够解决某些Windows bitrot问题。

我可以理解它的笨拙:)如果我们正在设计这个全新的系统,我会对其进行很多修改,但是我认为打破pip install -U pip对于非Windows的所有内容以方便用户使用不是保持一致性。 如果这是一个崭新的事物,那么就没有(或至少没有)用户尊敬:]

好,听起来不错。 没错,历史用法在这里更重要。

我实际上对Unix上的用户体验一无所知,所以我可能像其他人一样对单方面思考感到内。 我必须尝试看看在Linux上使用Python的感觉-是否有一个很好的“ Linux上的Python面向初学者”资源,该资源显示了如何设置Python(3)环境,如何设置各种工具等? [我经常发现并没有涉及到的一件事是如何使“ python”默认运行Python 3,如何使“ virtualenv”默认构建Python 3 virtualenvs,所有这些事情-在我看来,Python奇怪的是,Unix上的3比Windows上的二等要多得多。]

通常,您不想使python指向* nix上的python3,因为系统使用Python,并且并非所有库都将移植到Python3。 但是现在有一些Linux发行版将Python3作为默认发行版...我认为Arch? 也许下一个Fedora?

嗯,我不是在系统级别上讲,但实际上您无法选择在个人帐户中使用Python做什么? 按照我的想法,这绝对使Python 3成为第二等。但是它确实解释了为什么Unix用户似乎并没有像罪过一样丑陋地使用“ pip3”或“ pip3.3”之类的东西:-)

(无论如何,我们在这里没有话题,所以没关系)。

您可以设置外壳,使其在系统bin之前具有〜/ bin /,并在其中添加从python到python3的符号链接,但可以。 如果您确实有兴趣进行设置,我们很乐意提供帮助:] IRC或Email。

我相信Paul所指的我的工作只是实现“ 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的一些伪造功能,您可以像使用Sysinternal的进程资源管理器一样,将句柄关闭为pip.exe

我认为您无法关闭当前正在运行的exe的所有句柄。 但是,如果您以工作代码为例,那么我很乐意看到它,因为这一直是人们争论的一个问题,并且一直以来的共识是,这是不可能的(“重命名和稍后删除”之类的技巧除外) )。 做到这一点的工作代码对社区非常有用。

遇到同样的问题。

作为一个快速技巧,pip.exe可以在执行之前检测到它正在升级并使用python -m pip {{ sys.argv }}重新启动吗?

我不认为这确实有效。

但是,也许是一个愚蠢的想法,不需要更新.exe,我们是否可以仅对pip.exe进行特殊处理并将其保留? 安装后可能会留下一个pip.exe。

@dstufft是正确的,“重启自己”并不像@techtonik在Windows上听起来那么简单,在Windows上没有Unix exec调用。

从技术上讲,如果入口点更改或distlib包装器代码更改,则可能需要更新pip.exe 。 这种情况并不常见,但是有可能发生(早期,distlib代码发生了很大的变化,直到事情解决为止)。 可能要做的是将新的pip.exe写入一个临时位置,然后如果它与当前位置相同,则跳过它。 当确实需要更新时,您将无法避免错误,但是在99%的情况下,如果您不需要更新,就可以了。

顺便说一句,我们在这里转圈。 根据Vinay先前的评论,此问题已在distlib中解决(我认为应该在此处解决),但是pip并未以允许其工作的方式使用API​​。 如果我们可以使用distlib解决方案,那就太好了。 否则,我们需要有人编写特定于点子的解决方案(我仍然怀疑可以以健壮,可维护的方式完成此任务,而这种方式不会比发行令所要求的复杂得多)。

建议:

  1. 有人在http://www.pip-installer.org/en/latest/installing.html#install-or-upgrade-pip的pip文档中添加了一部分,并指出Windows上需要python -m pip解决方法当自己升级点子时。 我可能会在某个时候有机会这样做,但是对此问题做出贡献的人们的PR会很感激被接受:-)。
  2. 如果有人有可行的解决方案并准备实施,则应该提高PR,我们可以查看实际代码,而不是提议的方法。

我认为我们正处在实际的工作代码将推动这一问题向前发展的唯一阶段。

我在不尝试其他解决方案的情况下使文档膨胀-1。

我正在+1记录当前有效的内容。

即使使用文档注释,它仍然是解决方法-不是解决方案,并且Windows的命令提示符错误。

也许这很疯狂,但我总是这样做:

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

当然,这需要一个有libcurl的,但也有Windows二进制这里

我尝试将其安装在Mac上,但收到了

Alexs-MacBook- Air:Pipmodules aleand $ pip install -U pip
-bash:pip:找不到命令
Alexs-MacBook- Air:Pipmodules aleand $ python get-pip.py
下载/解压点
正在下载pip-1.5.5-py2.py3-none-any.whl(1.2MB):已下载1.2MB
安装收集的软件包:pip
打扫干净...
例外:
追溯(最近一次通话):
主文件122行中的文件“ /var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/basecommand.py”
状态= self.run(选项,参数)
运行中的文件“ /var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/commands/install.py”
requirements_set.install(安装选项,全局选项,root = options.root_path)
在安装中,文件“ /var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/req.py”
required.install(install_options,global_options,_args,* _ kwargs)
安装中的文件“ /var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/req.py”
self.move_wheel_files(self.source_dir,root = root)
在move_wheel_files中的第901行,文件“ /var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/req.py”
pycompile = self.pycompile,
在move_wheel_files中的第215行,文件“ /var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/wheel.py”
clobber(来源,lib_dir,True)
文件205行,文件“ /var/folders/8g/b9q8snrd5ln_d5hqnwh2_86r0000gn/T/tmpFTGrC3/pip.zip/pip/wheel.py”
os.makedirs(destdir)
在makedirs中的文件“ /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py”,第157行
mkdir(名称,模式)
OSError:[Errno 13]权限被拒绝:'/Library/Python/2.7/site-packages/pip'

将失败的调试日志存储在/Users/aleand/Library/Logs/pip.log中

@zaducu ,我可以从您的回溯中得知您正在尝试更新mac上预装的Python版本中的pip版本。 由于您正在更新预安装的版本,因此需要使用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自制软件,MacPorts,Fink或自行构建。

对于官方Python,您仍然需要sudo但是它将在/System/Frameworks安装大多数项目,而不是/System/Library/Frameworks对于Homebrew,您不需要sudo 。 不能代表MacPorts或Fink。

从1.5.4升级到6.0.8的Windows上仍然存在相同的问题:

E:\ Distrib \ Programming> pip install -U pip
https://pypi.python.org/packages/py2.py3/p/pip/pip-6.0.8-py2.py3-none-any.whl#md5 = 41e73fae2c86ba2270ff51c1d86下载/解压pip
f7e09
安装收集的软件包:pip
找到现有安装:pip 1.5.4
卸载点:
已成功卸载pip
打扫干净...
例外:
追溯(最近一次通话):
_rmtree_unsafe中的文件“ C:\ Python \ 3.3-32 \ lib \ shutil.py”,行371
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
在commit_uninstall中,文件“ C:\ Python \ 3.3-32 \ lib \ site-packagespipreq.py”,行610
提交中的文件“ C:\ Python \ 3.3-32 \ lib \ site-packagespipreq.py”,行1860
rmtree中的文件“ C:\ Python \ 3.3-32 \ lib \ site-packagespip \ util.py”,第43行
rmtree中的文件“ C:\ Python \ 3.3-32 \ lib \ shutil.py”,行478
返回_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”,行368
_rmtree_unsafe(全名,错误)
_rmtree_unsafe中的文件“ C:\ Python \ 3.3-32 \ lib \ shutil.py”,行373
onerror(os.unlink,全名,sys.exc_info())
rmtree_errorhandler中的文件“ C:\ Python \ 3.3-32 \ lib \ site-packagespip \ util.py”,第62行
PermissionError:[WinError 5]现在:'c:\ users \ bialix \ appdata \ local \ temppip-6i_i7a-uninstallpython \ 3.3-32 \ scripts \ p
ip.exe”

这个问题有什么变化吗?

它在任何实际意义上都不是可修复的(至少,如果有人认为它是必须的,则需要提供一个完整且有效的补丁进行评估,因为尚无人找到修复它的方法-本质上是Windows的限制)。

在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,通过Chocolatey安装的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权限问题,而不是带有pip的问题。

这与我的python安装在C:的Windows目录结构之外有关吗?

我将对此进行搜索,但是我很好奇是否有人可以在这里发布他们可能认为这是由什么引起的。

欢呼的家伙

@AmazingHorse老实说,我不知道。 另一种可能性是,它可能与Chocolatey如何安装Python有关-可能在其跟踪器上报告了该问题(我假设他们有一个?),然后看看他们在说什么。

但是是的,从它的声音来看,这不是一个小问题。

Windows允许将内存映射文件(映射为图像或数据)重命名/移动到同一卷上的新名称。 因此, rmtree错误处理程序可以尝试重命名文件以将其移动到基本temp目录。 至少在那里不会干扰目录的删除。 如果文件位于与temp目录不同的卷上,或者存在共享冲突,或者文件的ACL阻止了该操作,则此解决方法将失败。 但是这些都不适用于这种情况。

如果在进程令牌中启用了Administrators组,则可以计划重命名的文件在系统重新启动时删除。 只需使用ctypes调用MoveFileExW(path, None, MOVEFILE_DELAY_UNTIL_REBOOT) 。 但是,这对于常规用户而言将失败,因为不允许他们修改会话管理器的PendingFileRenameOperations注册表值。

Windows 7/10上的pip正常运行,但更新> 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用户以及像我这样通常不使用Windows的旧Python用户真的很不利。 我可以很好地使用python -m pip install --upgrade pip ,但是我真的认为pip install --upgrade pip应该在Windows上自动推荐。 @dstufft已在2013年提出此建议。是否有充分的理由不这样做?

PS:对不起,我报告#3462作为此问题的重复。 我没有通过在跟踪器中搜索WindowsError发现此问题。 希望在此评论之后其他人会。

据我所知,当检测到自己的新版本时,pip已经向用户建议了该命令。 情况还不错。

@pekkaklarck不这样做的主要原因是很难发现。 首先,我不知道如何可靠地检测到正在从pip.exe而不是从python -m pip运行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 :您能否澄清建议该命令的时间? 在全新安装Python 2.7.11之后,我尝试了pip install -U pip ,但此错误失败了:

WindowsError:[错误5]访问被拒绝:'c:\ users \ koulutus \ appdata \ local \ temppip-65z4kx-uninstallpython27 \ scriptspip.exe'

@pfmoore :升级需求文件中的pip听起来非常罕见,可能会被忽略。 像@Ivoz一样,我认为pip.exesys.argv 。 或者,应该有可能捕获WindowsError并对此做出反应。

@Ivoz有效吗? 我以为pip.exe包装器将python作为子进程调用,所以它不起作用。 但是快速测试(在pip.main()打印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:

所以它的工作原理,但你必须要小心,你怎么发现pipsys.argv[0] (注意,第一个例子中包括目录pip的路径__main__.py

感谢您指出了这一点。 我今天学到了一些东西:-)

@pekkaklarck捕获WindowsError (如果我记得)的问题是,它发生得很晚,并且安装是部分完成的(并且不容易回滚)。

但是我不想阻止任何人尝试解决此问题,所以我将其保留为:-)

但您需要注意如何在sys.argv [0]中发现点

@pfmoore因此调用os.path.basename

@Ivoz叹息。 这里太晚了。 是的,显然:-)

@pekkaklarck 。 例如在Windows上执行pip list 。 据我在去年的讨论中所记得的:

  • 这是pypa团队认为可靠的唯一解决方案,
  • 它仅显示在Windows上。

pip_example

可能有更好的解决方案,但我认为这已经是以前情况的完美答案的80%。

也许更好的解决方案是在python默认Windows安装中提供一个“ upgrade_pip.bat”,而不是紧扣“ pip”,然后执行该命令。 (或pip_update.bat更好地匹配conda吗?)

我今天在潜入新的Windows Python用户体验时碰到了这一点。 太可怕了
我们可以为该命令自动设置-m吗? (也许给升级点它自己的命令?)

没有用户应该看到此消息,尤其是在完全运行_pip告诉他们运行_之后。

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

我认为我们已经在7.0.1之前的较新版本的pip中设置了日志记录设置,以告诉Windows用户使用python -m pip install --upgrade pip而不是pip install --upgrade pip

:sparkles::cake::sparkles:

是的,因为7.1 cf#2830

\ O /

我不能在赢10上升级我的点数,怎么了?

default

@grasx
如果您真的想知道出什么问题了,请阅读此主题。 如果您只想让它起作用,那么请阅读所获得输出的最后一行,并将其与运行结果进行比较。

@ piotr-dobrogost
是吗? 最后一条红线似乎指向解码问题,而不是访问拒绝错误,这是Windows上就地更新的常见结果。 @grasx的问题可能与西里尔代码页的使用有关吗?

我怀疑遇到的@grasx问题是否与此问题有关。 我在Windows上也看到过类似的问题。 参见#3463。

@nmusatti
你是对的。 我的错。

@ piotr-dobrogost @nmusatti @pekkaklarck但是,谢谢您,我更改了用户名,所以现在它仅包含ASCII字符,并且已成功将pip升级到8.1

@grasx更改了用户名?我对您所说的感到困惑...我遇到了同样的麻烦,不同之处在于我在Windows 7中

随机的想法,如果不需要的话不替换exe文件怎么办

据我了解,exe文件是很小的蹦床,通常可以正常工作

更重要的逻辑是在随附的脚本文件中

@ pzz2011好吧,实际上我重新安装了win并设置了新的用户名。 在我的情况下,然后发现在所有提到它的地方和路线上如何对其进行更改就比较容易了:)

@RonnyPfannschmidt取决于用于编写.exe的内容-用于使用foo.exe + foo-script.py setuptools(不确定现在要做什么),而distlib(如果已配置)则创建单个foo.exe嵌入脚本。

@grasx hhh ...我找到了一种更简单的方法来解决它。 我只是将python从2.7.x重新安装到2.7.10。
然后成功向我微笑〜

在Windows上,在管理员模式下使用命令提示符窗口。 然后输入命令
python -m pip install-升级pip

我希望这个对你有用。 这就是我让它在Window 10上工作的方式

祝好运。

@grasx不确定原因,但在Windows 8.1和Windows 10的Python安装程序中选择“为所有用户安装”时,会出现该错误。请重新安装,选择PATH并自定义安装。 确保未选中顶部复选框,然后选择安装位置。 之后在cmd中使用“ python -m pip install --upgrade pip”可以正常工作。

仅供Windows用户使用。 如果安装Cygwin,则会自动安装Python2.7。 然后,您需要做的就是运行:

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

(是的,您需要先安装wget 。)

image
如何解决这个问题呢?

J
请参阅此处从命令提示符窗口复制文本以获取有关如何复制文本的说明。 这样,您发布的文本将是可搜索的。

您正在使用pip版本7.1.0,但是版本9.0.1可用。
您应该考虑通过'python -m pip install --upgrade pip'comm进行升级
和。
D:\ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip_vendorrequ
ests \ packages \ urllib3 \ util \ ssl_.py:90:InsecurePlatformWarning:真正的SSLContex
对象不可用。 这样可以防止urllib3配置SSL权限
可能会导致某些SSL连接失败。 有关更多信息,请参见htt
ps://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning。
不安全的平台警告
收集点
正在下载pip-9.0.1-py2.py3-none-any.whl(1.3MB)
例外:
追溯(最近一次通话):
文件“ D:\ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ base
“ command.py”,第223行,在主目录中
状态= self.run(选项,参数)
文件“ D:\ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ comm
ands \ install.py”,第282行,正在运行
require_set.prepare_files(查找器)
文件“ D:\ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpipreq \
在repare_files中的req_set.py”,第334行
functools.partial(self._prepare_file,finder))
文件“ D:\ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpipreq \
req_set.py”,行_walk_req_to_install中的321行
more_reqs =处理程序(req_to_install)
文件“ D:\ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpipreq \
_prepare_file中的“ req_set.py”行491
session = 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(resp,链接,content_file)
文件“ D:\ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ down
_download_url中的第621行,“ load.py”
对于progress_indicator(resp_read(4096),4096)中的块:
文件“ D:\ Program Files \ Python27 \ lib \ site-packagespip-7.1.0-py2.7.eggpip \ util
s \ ui.py“,第135行,
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中
打印(线,结束='',文件= 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(text [start:end])
UnicodeEncodeError:'ascii'编解码器无法对位置8中的字符u'\ u258f'进行编码
:序数不在范围内(128)

@ JingY0604参见#3463。

您可以通过卸载现有安装并使用get-pip.py安装较新的版本来升级pip。

对于https://github.com/ofek/hatch,我只是捕获了所有更新self的实例并禁止它。 然后,我有一个明确的--self标志来执行,这样Popens一个python -m pip install -U hatch并立即退出。

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

编辑:从技术上讲,实际上只使用sys.executable而不是python

@ofek #4490改变了点子,打印出更好的消息,IIRC。

所以现在,如果我已经安装了不带pip的python,将来我将无法安装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

我在Windows的cmd中打印点子,但显示
启动器中发生致命错误:无法使用'“” 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卸载pip”,然后再执行“ python -m pip安装-U pip”

要求已最新:c:\ user \ clarkk \ appdata \ local \ Programs \ Python \ Python36 \ lib \ site-packages(10.0.1)中的pip

      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.

我在运行上述命令时遇到错误,因为单词get的语法错误可能是解决该问题的方法

@AProNoob您应该在命令提示符(cmd或powershell)而不是Python提示符下运行命令。

谢谢! 可行!

该线程已被自动锁定,因为它关闭后没有任何近期活动。 请为相关错误打开新一期。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

therefromhere picture therefromhere  ·  3评论

imzi picture imzi  ·  3评论

kkom picture kkom  ·  3评论

Zac-HD picture Zac-HD  ·  3评论

dstufft picture dstufft  ·  3评论