在代码中升级python模块

时间:2014-09-16 06:56:41

标签: python pip

我的问题与此问题有关:Installing python module within code,但涉及升级模块。

我已经尝试了

packages=['apscheduler','beautifulsoup4','gdata']

def upgrade(packages):
    for package in packages:
        pip.main(['install --upgrade', package])

def upgrade(packages):
    for package in packages:
        pip.main(['install', package + ' --upgrade'])

3 个答案:

答案 0 :(得分:13)

尝试pip.main(['install', '--upgrade', package])

“ - upgrade”是一个单独的命令行参数,因此您需要将其单独传递给main

答案 1 :(得分:1)

BrenBarn's answer符合OP代码的风格,但Richard Wheatley's answer更接近我的代码。

理查德的答案有几个我想解决的问题,但我不想编辑他,因为差异相当大。

from subprocess import call

my_packages = ['apscheduler', 'beautifulsoup4', 'gdata']

def upgrade(package_list):
    call(['pip', 'install', '--upgrade'] + package_list)

注意:

  • 无需导入pip模块(subprocess调用其路径中找到的pip二进制文件)
  • 应该避免在shell=True(和其他call()函数)中不必要地使用subprocessit puts responsibility on the programmer to protect against shell injection vulnerabilities。 (这里不是一个问题,但作为一般规则是好的。)
  • pip install的单个调用接受任意数量的包名称,--upgrade的一次使用将适用于所有这些名称。
  • 我们可以利用前面的事实和Python的列表连接来避免编写循环。

答案 2 :(得分:0)

我现在这是一个老线程,但我已经遇到过很多次了,我想我应该给出另一个解决方案,因为我已经使用过这个。对我而言,这更加用户友好。

import pip
from subprocess import call

packages=['apscheduler','beautifulsoup4','gdata']

def upgrade(packages):
    for package in packages:
        call("pip install --upgrade " + package, shell=True)

阅读以下Actual meaning of 'shell=True' in subprocess帖子后,似乎不需要shell = True命令,这可能不是最好的主意。     我不需要import pip,因为我之前的答案中没有看到pip.main

所以新代码可能是:     来自子进程导入调用

packages=['apscheduler','beautifulsoup4','gdata']

def upgrade(packages):
    for package in packages:
        call("pip install --upgrade " + package)

至于其他答案,我更喜欢传递特定的字符串和循环。 使用任何一种方法都不会获得性能损失或增益。