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

问题描述 投票:0回答:13

我需要直接在我的脚本中安装来自 PyPI 的软件包。

是否有一些模块或

distutils
distribute
pip
等)功能允许我执行类似
pypi.install('requests')
之类的操作,并且请求将被安装到我的virtualenv中?

python pip python-module pypi
13个回答
592
投票

官方推荐的从脚本安装包的方法是通过子进程调用 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])
    

438
投票
您还可以使用类似以下内容:

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')
    

90
投票
如果你想使用

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?


47
投票
这应该有效:

import subprocess import sys def install(name): subprocess.call([sys.executable, '-m', 'pip', 'install', name])
    

40
投票
我在

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
    

29
投票
为了安装多个软件包,我使用带有以下代码的

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])
    

13
投票
用途:

import os os.system('pip install requests')
我尝试了上述临时解决方案,而不是更改 

Docker 文件


8
投票
如果您想要一个更有效的答案,可以扩展

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)

相关信息:

Stack Overflow问题:58612272


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

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


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
投票
import pip try: import imaplib import email import pandas as pd # for hiding password from pathlib import Path from dotenv import load_dotenv import os import requests # from collections import defaultdict from itertools import permutations,combinations except Exception as e: print(e) e = str(e).split(' ')[-1].replace("'","") pip.main(['install', e])
    

1
投票
我不喜欢所有建议的选项,我为此编写了我的

安装:

pip install instld
并使用上下文管理器:

import installed with installed('some_package'): import some_module
要了解有关该库的更多信息,请点击我上面提供的链接。它允许您在一个程序中使用同一库的两个不同版本,或者例如彼此不兼容的库。


0
投票
尝试以下方法。到目前为止,这是最适合我的。

先安装 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)
    
© www.soinside.com 2019 - 2024. All rights reserved.