我需要在我的脚本中直接从PyPI安装一个包。
是否有某个模块或distutils
(distribute
, pip
等)功能,允许我只需执行类似于pypi.install('requests')
的命令就能将requests安装到我的虚拟环境中?
我需要在我的脚本中直接从PyPI安装一个包。
是否有某个模块或distutils
(distribute
, pip
等)功能,允许我只需执行类似于pypi.install('requests')
的命令就能将requests安装到我的虚拟环境中?
从脚本中安装软件包的官方推荐方式是通过调用 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.main()
传递选项(但每个选项应作为列表中的单独条目,而不是单个字符串)。要指定所需包的版本,请使用与命令行相同的方式。例如:pip.main(['install', 'pip==7.1.0'])
。 - Kaosfrom pip._internal import main as pipmain
,然后像废弃的 pip.main()
一样使用 pipmain()
。参见 https://dev59.com/-1cQ5IYBdhLWcg3wD_ho。 - 3pitt如果您想使用 pip
安装所需的包并在安装后导入它,请使用此代码:
要使用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? 以获取更多信息。
imp.reload(site)
时出现了RuntimeError: dictionary changed size during iteration
的错误提示。 - kgadekpip uninstall <package_name>
命令卸载它。虽然我仍然可以使用 pip.main
命令卸载它,但我想知道这个包被安装在哪里了? - Ishan Kharepip install requests[security]
,它会正常工作吗?我不确定它是否会正确定义全局变量。 - Fallenreaperpip.main
不再有效。https://pip.pypa.io/en/latest/user_guide/#using-pip-from-your-program - wiminstall_and_import
函数的命名空间中? - sh37211import subprocess
def install(name):
subprocess.call([sys.executable, '-m', 'pip', 'install', name])
[sys.executable, '-m', 'pip', 'install', name]
确保获取“正确”的pip。 - wim我对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
subprocess.call
的返回值,所以代码可能会失败。 - Antti Haapala -- Слава Україніsubprocess.check_call
而不是subprocess.call
? - Coddyexcept
代码块后再进行最后一次导入。 - AD - Stop Putin -为了安装多个软件包,我正在使用一个带有以下代码的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)
相关信息:Stack Overflow问题:58612272
subprocess.check_call(
[sys.executable, "-m", "pip", "install", *requirements])
else:
print("要求已经满足。")
- Simon Provost在您自己的软件包的setup.py文件中,使用"install_requires"选项定义依赖模块。
如果您的软件包需要生成一些控制台脚本,则可以使用"console_scripts"入口点来生成一个包装器脚本,该脚本将放置在'bin'文件夹中(例如您的虚拟环境)。
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._internal
不是为了可导入而设计的,当在另一个程序中导入时,它可能会做绝对随机的事情。 - Antti Haapala -- Слава Україні