416

我需要直接在我的脚本中从 PyPi 安装一个包。也许有一些模块或distutilsdistributepip)功能允许我执行类似的操作pypi.install('requests'),并且请求将安装到我的 virtualenv 中。

4

11 回答 11

447

官方推荐的从脚本安装包的方法是通过子进程调用 pip 的命令行界面。pip 不支持此处提供的大多数其他答案。此外,自 pip v10 以来,所有代码都已pip._internal精确移动,以便向用户明确表示不允许以编程方式使用 pip。

用于sys.executable确保您将调用pip与当前运行时相同的关联。

import subprocess
import sys

def install(package):
    subprocess.check_call([sys.executable, "-m", "pip", "install", package])
于 2018-05-09T13:47:15.733 回答
415

你也可以使用类似的东西:

import pip

def install(package):
    if hasattr(pip, 'main'):
        pip.main(['install', package])
    else:
        pip._internal.main(['install', package])

# Example
if __name__ == '__main__':
    install('argh')
于 2013-04-11T13:54:43.213 回答
84

如果您想使用pip安装所需的包并在安装后将其导入,您可以使用以下代码:

def install_and_import(package):
    import importlib
    try:
        importlib.import_module(package)
    except ImportError:
        import pip
        pip.main(['install', package])
    finally:
        globals()[package] = importlib.import_module(package)


install_and_import('transliterate')

如果您以用户身份安装包,您可能会遇到无法仅导入包的问题。请参阅如何刷新 sys.path?了解更多信息。

于 2014-07-16T06:45:37.380 回答
31

这应该有效:

import subprocess

def install(name):
    subprocess.call(['pip', 'install', name])
于 2012-09-08T17:52:29.950 回答
26

我在@Aaron 的回答中添加了一些异常处理。

import subprocess
import sys

try:
    import pandas as pd
except ImportError:
    subprocess.check_call([sys.executable, "-m", "pip", "install", 'pandas'])
finally:
    import pandas as pd
于 2019-09-21T12:58:14.307 回答
10

为了安装多个软件包,我使用了一个setup.py包含以下代码的文件:

import sys
import subprocess
import pkg_resources

required  = {'numpy', 'pandas', '<etc>'} 
installed = {pkg.key for pkg in pkg_resources.working_set}
missing   = required - installed

if missing:
    # implement pip as a subprocess:
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', *missing])
于 2020-07-26T06:09:57.010 回答
5

您可以使用“install_requires”选项在您自己的包的 setup.py 中定义依赖模块。

如果您的包需要生成一些控制台脚本,那么您可以使用“console_scripts”入口点来生成一个包装脚本,该脚本将放置在“bin”文件夹中(例如,您的 virtualenv 环境)。

于 2012-09-08T17:38:59.383 回答
3

如果您想要一个扩展的更有效的答案subprocess.check_call。您可以先使用 . 检查是否已满足要求pkg_resources

这适用于不同的需求说明符,这很好。例如>===

import sys
import subprocess
import pkg_resources
from pkg_resources import DistributionNotFound, VersionConflict

def should_install_requirement(requirement):
    should_install = False
    try:
        pkg_resources.require(requirement)
    except (DistributionNotFound, VersionConflict):
        should_install = True
    return should_install


def install_packages(requirement_list):
    try:
        requirements = [
            requirement
            for requirement in requirement_list
            if should_install_requirement(requirement)
        ]
        if len(requirements) > 0:
            subprocess.check_call([sys.executable, "-m", "pip", "install", *requirements])
        else:
            print("Requirements already satisfied.")

    except Exception as e:
        print(e)

示例用法:

requirement_list = ['requests', 'httpx==0.18.2']
install_packages(requirement_list)

演示

相关信息Stackoverflow 问题:58612272

于 2021-08-08T16:45:39.213 回答
2
import os
os.system('pip install requests')

我在上面尝试了临时解决方案,而不是更改 docker 文件。希望这些可能对某些人有用

于 2020-11-30T15:20:37.023 回答
1

试试下面的。到目前为止对我最有效的方法先安装 4 个,然后在所需列表中提及新的

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)
于 2021-05-02T19:59:44.827 回答
0

为了有条件地安装多个具有确切版本的软件包,我一直在使用这种模式,基于@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])}')
于 2021-09-21T16:29:26.663 回答