我需要直接在我的脚本中安装来自 PyPI 的软件包。
是否有一些模块或
distutils
(distribute
、pip
等)功能允许我执行类似pypi.install('requests')
之类的操作,并且请求将被安装到我的virtualenv中?
官方推荐的从脚本安装包的方法是通过子进程调用 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])
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')
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?。
import subprocess
import sys
def install(name):
subprocess.call([sys.executable, '-m', 'pip', 'install', name])
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
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])
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)
相关信息:
如果您的包需要生成一些控制台脚本,那么您可以使用“console_scripts”入口点来生成将放置的包装器脚本 在“bin”文件夹中(例如您的 virtualenv 环境)。
有条件地安装多个具有确切版本的软件包,我一直在根据@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])}')
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])
库。
安装:
pip install instld
并使用上下文管理器:
import installed
with installed('some_package'):
import some_module
要了解有关该库的更多信息,请点击我上面提供的链接。它允许您在一个程序中使用同一库的两个不同版本,或者例如彼此不兼容的库。
先安装 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)