我需要在脚本中直接从PyPi安装一个包。 也许有一些模块或distutils(分发,pip等)功能,允许我只执行类似pypi.install('requests')的东西,请求将被安装到我的virtualenv中。
当前回答
你可以用"install_requires"选项在你自己的包的setup.py中定义依赖模块。
如果您的包需要生成一些控制台脚本,那么您可以使用“console_scripts”入口点来生成将放置的包装器脚本 在“bin”文件夹中(例如你的virtualenv环境)。
其他回答
如果你想要一个更有效的答案,扩展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
为了安装多个包,我使用了一个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])
我在@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
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])
你还可以使用如下语句:
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')
推荐文章
- 将Pandas或Numpy Nan替换为None以用于MysqlDB
- 使用pandas对同一列进行多个聚合
- 使用Python解析HTML
- django MultiValueDictKeyError错误,我如何处理它
- 如何在for循环期间修改列表条目?
- 我如何在Django中创建一个鼻涕虫?
- 没有名为'django.core.urlresolvers'的模块
- 蟒蛇导出环境文件
- Django - makemigrations -未检测到任何更改
- SQLAlchemy:引擎、连接和会话差异
- 在Python Pandas中删除多个列中的所有重复行
- 更改pandas DataFrame中的特定列名
- 将Pandas多索引转换为列
- 熊猫在每组中获得最高的n个记录
- 熊猫数据帧得到每组的第一行