【问题标题】:upgrading python module within code在代码中升级 python 模块
【发布时间】:2017-11-14 21:04:23
【问题描述】:

我的问题与这个问题有关: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'])

【问题讨论】:

  • 你试过pip.main(['install', '--upgrade', package])吗?
  • 不,我没有。我知道我应该被鞭打。我现在该怎么处理这个问题?删除它?
  • 我添加了它作为答案,如果它有效,你可以接受它。

标签: python pip


【解决方案1】:

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

“--upgrade”是一个单独的命令行参数,所以需要单独传递给main

【讨论】:

【解决方案2】:

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

不过,Richard 的回答有几个我想解决的问题,我不想编辑他的,因为这些差异相当显着。

from subprocess import call

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

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

注意事项:

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

【讨论】:

    【解决方案3】:

    我现在这是一个旧线程,但我已经多次遇到它,我认为我应该提供另一种解决方案,因为我已经使用过这个解决方案。对我来说,这对用户来说更友好。

    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)
    

    至于其他答案,我更喜欢传递特定的字符串和循环。 使用任何一种方法都不会影响性能或提高性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 2018-12-19
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-23
      相关资源
      最近更新 更多