如何在代码中安装Python模块?

496

我需要在我的脚本中直接从PyPI安装一个包。

是否有某个模块或distutils (distribute, pip等)功能,允许我只需执行类似于pypi.install('requests')的命令就能将requests安装到我的虚拟环境中?


4
为什么不在你自己的包的 setup.py 中将相关模块定义为依赖关系? - user2665694
8
你知道...实际上应该这样做...但你总是可以使用os.system("pip install blah"),但你可能需要sudo权限...最好将其作为依赖项在你的setup.py中设置。 - Joran Beasley
2
@chuwy https://dev59.com/Gmct5IYBdhLWcg3wHZ9q#50255019 <= 这个。pip._internal 不是为了可导入而设计的,当在另一个程序中导入时,它可能会做绝对随机的事情。 - Antti Haapala -- Слава Україні
2
@Antti是正确的。目前最佳答案在这里。当前接受的答案不建议使用,容易出错,正如_pip_用户指南中“从程序中使用pip”的部分所明确说明的那样。巧合的是,这也是正在由_pip_的维护者们讨论的问题 - sinoroc
3
好的,我已经修改了。个人而言,我不喜欢这两种解决方案,但是最近我离 Python 很远,所以我相信你的意见。 - chuwy
显示剩余5条评论
13个回答

1
为了有条件地安装多个精确版本的软件包,我一直在使用这种模式,基于@Tanmay Shrivastava的答案:
import sys
from subprocess import run, PIPE, STDOUT
import pkg_resources

def run_cmd(cmd):
    ps = run(cmd, stdout=PIPE, stderr=STDOUT, shell=True, text=True)
    print(ps.stdout)


# packages to be conditionally installed with exact version
required = {"click==8.0.1", "semver==3.0.0.dev2"}
installed = {f"{pkg.key}=={pkg.version}" for pkg in pkg_resources.working_set}
missing = required - installed

if missing:
    run_cmd(f'pip install --ignore-installed {" ".join([*missing])}')

1

我不太喜欢所有的建议选项,所以我为此写了我的

安装它:

pip install instld

并使用上下文管理器:

import installed

with installed('some_package'):
  import some_module

要了解更多关于该库的信息,请访问我上面提供的链接。它允许您在一个程序中使用两个不同版本的同一库,或者例如不兼容的库。


0

尝试以下方法。到目前为止,这是对我最有效的方法。

首先安装前4个,然后在“REQUIRED”列表中提及新的那些:

import pkg_resources
import subprocess
import sys
import os

REQUIRED = {
  'spacy', 'scikit-learn', 'numpy', 'pandas', 'torch',
  'pyfunctional', 'textblob', 'seaborn', 'matplotlib'
}

installed = {pkg.key for pkg in pkg_resources.working_set}
missing = REQUIRED - installed

if missing:
    python = sys.executable
    subprocess.check_call([python, '-m', 'pip', 'install', *missing], stdout=subprocess.DEVNULL)

3
这只是Tanmay Shrivastava答案的复制。 - Glen Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接