我需要在脚本中直接从PyPi安装一个包。 也许有一些模块或distutils(分发,pip等)功能,允许我只执行类似pypi.install('requests')的东西,请求将被安装到我的virtualenv中。
当前回答
试试下面的方法。到目前为止,对我来说是最好的 首先安装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)
其他回答
官方推荐的从脚本安装包的方法是通过子进程调用pip的命令行接口。这里提供的大多数其他答案都不支持pip。此外,从pip v10开始,所有代码都转移到pip。正是为了让用户清楚地知道,不允许以编程方式使用PIP。
使用系统。以确保您将调用与当前运行时相关联的相同PIP。
import subprocess
import sys
def install(package):
subprocess.check_call([sys.executable, "-m", "pip", "install", package])
为了安装多个包,我使用了一个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])
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])
如果你想要一个更有效的答案,扩展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
如果你想使用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?获取更多信息。
推荐文章
- 每n秒运行特定代码
- SQLAlchemy是否有与Django的get_or_create等价的函数?
- 如何将python datetime转换为字符串,具有可读格式的日期?
- 美丽的汤和提取div及其内容的ID
- 在Python中重置生成器对象
- 用Python构建最小的插件架构
- model.eval()在pytorch中做什么?
- Tensorflow 2.0:模块“Tensorflow”没有属性“Session”
- 从环境文件中读入环境变量
- 在OSX 10.11中安装Scrapy时,“OSError: [Errno 1]操作不允许”(El Capitan)(系统完整性保护)
- 如何删除熊猫数据帧的最后一行数据
- 我如何在熊猫中找到数字列?
- 检查pandas数据框架索引中是否存在值
- 计算熊猫数量的最有效方法是什么?
- 如何在python中验证日期字符串格式?