Python重载点不起作用

时间:2017-06-06 21:51:12

标签: python-2.7

我目前正在尝试升级pip,然后在python脚本中安装paramiko,因为脚本本身使用了paramiko。以下是我想要完成的一个简单案例

import pip

try:
        import paramiko
except ImportError:
        pip.main(["install", "--upgrade", "pip"])
        reload(pip)
        pip.main(["install", "--user", "paramiko"])
        import paramiko

ssh = paramiko.SSHClient()

我在使用python 2.7的Ubuntu 16.04 VM中运行此脚本,它没有paramiko和pip版本8.1.1。对于运行脚本后的pip升级输出,我得到:

  

收集点子下载pip-9.0.1-py2.py3-none-any.whl(1.3MB)       100%|████████████████████████████████| 1.3MB 712kB / s安装收集的软件包:pip已成功安装pip-8.1.1您正在使用   pip版本8.1.1,但版本9.0.1可用。你应该   考虑通过'pip install --upgrade pip'命令进行升级。

之后,它尝试按预期安装paramiko,但它失败了,因为它基本上无法安装paramiko使用的Cryptography依赖项。但是,如果它使用升级的点,这不会是一个问题。我已将VM恢复为之前的快照,通过执行

手动安装paramiko
pip install --upgrade pip
pip install --user paramiko
在shell中

并且它可以工作,但我需要能够在脚本中执行此操作。

注意,我还将VM还原到以前的快照并尝试在shell中使用上面的命令安装paramiko,但是没有先执行pip升级,并且正如预期的那样,我得到的错误与脚本在尝试时提供的错误相同安装paramiko。 现在我尝试在脚本中进行一些测试:

pip.main(["install", "--upgrade", "pip"])
reload(pip)
pip.main(["install", "--upgrade", "pip"])
reload(pip)

至于输出我得到了这个:

  

收集点子   正在下载pip-9.0.1-py2.py3-none-any.whl(1.3MB)

100% |████████████████████████████████| 1.3MB 712kB/s Installing collected packages: pip Successfully installed pip-8.1.1 You are using pip version 8.1.1, however version 9.0.1 is available. 
     

您应该考虑通过'pip install --upgrade pip'命令进行升级。

     

收集点子   使用缓存的pip-9.0.1-py2.py3-none-any.whl

     

安装收集的软件包:pip已成功安装pip-8.1.1

     

您正在使用pip版本8.1.1,但版本9.0.1可用。

     

您应该考虑通过'pip install --upgrade pip'命令进行升级。

请注意它在第二次pip升级时如何使用缓存的pip-9.0.1。这是否意味着在重新加载后,脚本使用的是pip 9.0.1?如果是这样,为什么paramiko安装不使用升级的点子?如何让paramiko使用升级的pip?

2 个答案:

答案 0 :(得分:1)

您是否尝试从sys.modules数组中删除pip包?

import pip
import sys
import site

print ('PIP Version: ' + pip.__version__)

pip.main(["install", "--upgrade", "pip"])

user_path  = site.getusersitepackages()
sytem_path = site.getsitepackages()

sys.path = [user_path] + system_path + sys.path

pips = [module for module in sys.modules if module.startswith('pip')]
for pip_module in pips:
    sys.modules.pop(pip_module)

del pip

import pip
print ('PIP Version: ' + pip.__version__)

在安装了pip 8.1.1的机器上运行Runinng,得到的输出是:

 begnini@coffee-machine:~# python update.py
 PIP Version: 8.1.1
 Collecting pip
  Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
    100% |████████████████████████████████| 1.3MB 651kB/s
 Installing collected packages: pip
  Found existing installation: pip 8.1.1
    Uninstalling pip-8.1.1:
      Successfully uninstalled pip-8.1.1
 Successfully installed pip-9.0.1
 PIP Version: 9.0.1
编辑:就像我们讨论的那样,问题是pip试图先在主python lib目录中搜索,而不是/ usr / local / lib目录。为了解决这个问题,我在系统路径数组的第一个位置添加了本地lib目录。通过此修改,应该修复错误。

编辑2:添加了站点路径,而不是使用硬编码的目录。

答案 1 :(得分:0)

所以经过一些挖掘,看起来这是一个已被修补的pip bug。不幸的是,我可能并不总是控制将运行此脚本的机器(即无法应用补丁)所以我的解决方案只是使用os.execl()重新启动脚本,每当第二次导入paramiko时除外部分失败。

至于错误,总之,在点数升级之后,报告了错误的版本,但pip已升级。因此,如果脚本再次运行,则使用新版本的pip,这样可以正确安装paramiko,因此可以重新启动脚本。

有关使用os.execl()的指导,因为python文档不是很清楚,请关注this link

我的代码现在看起来如何:

max()