【问题标题】:conda install doesn't ask for permission before installing modulesconda install 在安装模块之前不请求许可
【发布时间】:2022-01-10 08:35:40
【问题描述】:

我编写了一个在githooks/post-merge 中使用的python 脚本,其目的是从存在于同一存储库中的env.yml 文件中安装或更新模块。我使用了以下代码:

    for module in modules_to_update:
        print("\n================================= Updating {} ==================================\n".format(module))
        update_command = ['conda', 'install', '{}={}'.format(module.name, module.version)]
        subprocess.run(update_command)

可以看出,modules_to_update 包含将要安装/更新的模块。我没有使用conda update,因为我不希望自动更新。

问题是:我预计 conda 会请求允许单独安装/更新每个模块,但它没有按计划工作。当我尝试这样做时,每个模块都做了同样的事情——无需等待我的输入即可继续:

Proceed ([y]/n)?
Preparing transaction: done
Verifying transaction: done
...

我没有使用 -y 标志,所以它不应该以这种方式工作,当我尝试单独使用 python 脚本时它工作得很好。

【问题讨论】:

  • 您在没有输入附加到子进程的stdin 的情况下运行,所以它默认为[y]

标签: python python-3.x conda githooks


【解决方案1】:

您没有将任何stdin 附加到子进程。因此,子进程可能会执行某种read() 调用,得到一个空字符串(因为没有附加任何内容)并在提示中默认为[y] yes。

您可以使用run(..., stdin=sys.stdin),但通过os.system() 运行交互式命令可能更容易。 (不过,不要使用纯字符串连接来形成命令行,以避免 shell 注入。)

import shlex

update_command = ['conda', 'install', '{}={}'.format(module.name, module.version)]

os.system(shlex.join(update_command))

【讨论】:

    猜你喜欢
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2021-08-15
    • 2018-01-29
    • 2023-04-02
    相关资源
    最近更新 更多