如何检查 Python 中是否安装了模块,如果没有,则在代码中安装它?
How to check if a module is installed in Python and, if not, install it within the code?
我想为我的代码安装模块 'mutagen' 和 'gTTS',但我想要它,这样它会在没有这些模块的每台计算机上安装它们,但是如果它们已经安装,它不会尝试安装它们。我目前有:
def install(package):
pip.main(['install', package])
install('mutagen')
install('gTTS')
from gtts import gTTS
from mutagen.mp3 import MP3
但是,如果您已经有了这些模块,这只会在您打开程序时给程序的开头添加不必要的混乱。
您可以使用命令行:
python -m MyModule
它会说模块是否存在
否则,您可以简单地使用最佳实践:
pip freeze > requirements.txt
这会将您安装的模块 python 安装在一个文件中
和:
pip install -r requirements.txt
加载它们
它会自动满足你的目的
玩得开心
编辑 - 2020/02/03
自从我发布此答案以来,pip
模块已经更新了很多。我已经用安装缺失依赖项的正确方法更新了代码片段,即使用 subprocess
和 pkg_resources
,而不是 pip
.
要隐藏输出,您可以将子进程输出重定向到 devnull:
import sys
import subprocess
import pkg_resources
required = {'mutagen', 'gTTS'}
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)
就像@zwer 提到的那样,上面的方法有效,尽管它不被视为打包项目的正确方法。要更深入地了解这一点,请阅读页面 How to package a Python App。
另一种解决方案是将您要导入的任何内容的导入语句放入 try/except 块中,因此如果它有效,它就会被安装,但如果无效,它会抛出异常,您可以 运行 安装它的命令。
如果您想知道某个软件包是否已安装,您可以在终端中使用以下命令进行检查:
pip list | grep <module_name_you_want_to_check>
这是如何工作的:
pip list
列出安装在 Python 中的所有模块。
竖线|通常被称为“管道”。它用于将一个命令通过管道传输到另一个命令。也就是说,它将第一个命令的输出定向到第二个命令的输入。
grep <module_name_you_want_to_check>
从列表中找到关键字。
示例:
pip list| grep quant
列出所有以“quant”开头的软件包(例如“quantstrats”)。如果你没有任何输出,这意味着库没有安装。
您可以使用 pkg_resources.get_distribution
:
检查是否安装了软件包
import pkg_resources
for package in ['mutagen', 'gTTS']:
try:
dist = pkg_resources.get_distribution(package)
print('{} ({}) is installed'.format(dist.key, dist.version))
except pkg_resources.DistributionNotFound:
print('{} is NOT installed'.format(package))
注意:您不应该直接导入 pip
模块作为 pip
命令的 it is an unsupported use-case。
recommended way of using pip
from your program is to execute it using subprocess
:
subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'my_package'])
你可以使用简单的 try/except:
try:
import mutagen
print("module 'mutagen' is installed")
except ModuleNotFoundError:
print("module 'mutagen' is not installed")
# or
install("mutagen") # the install function from the question
如果您想预览是否安装了特定的包(或某些包),也许您可以使用 python 中的空闲。
具体来说:
- 打开闲置
- 浏览到文件 > 打开模块 > 一些模块
- IDLE 将显示模块或提示错误消息。
以上是使用 python 3.9.0
测试的
你可以运行pip show package_name
或广阔的视野 use pip list
Reference
尽管@girrafish 的回答可能就足够了,您也可以通过 importlib
检查软件包安装:
import importlib
packages = ['mutagen', 'gTTS']
[subprocess.check_call(['pip', 'install', pkg])
for pkg in packages if not importlib.util.find_spec(pkg)]
我想为我的代码安装模块 'mutagen' 和 'gTTS',但我想要它,这样它会在没有这些模块的每台计算机上安装它们,但是如果它们已经安装,它不会尝试安装它们。我目前有:
def install(package):
pip.main(['install', package])
install('mutagen')
install('gTTS')
from gtts import gTTS
from mutagen.mp3 import MP3
但是,如果您已经有了这些模块,这只会在您打开程序时给程序的开头添加不必要的混乱。
您可以使用命令行:
python -m MyModule
它会说模块是否存在
否则,您可以简单地使用最佳实践:
pip freeze > requirements.txt
这会将您安装的模块 python 安装在一个文件中
和:
pip install -r requirements.txt
加载它们
它会自动满足你的目的
玩得开心
编辑 - 2020/02/03
自从我发布此答案以来,pip
模块已经更新了很多。我已经用安装缺失依赖项的正确方法更新了代码片段,即使用 subprocess
和 pkg_resources
,而不是 pip
.
要隐藏输出,您可以将子进程输出重定向到 devnull:
import sys
import subprocess
import pkg_resources
required = {'mutagen', 'gTTS'}
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)
就像@zwer 提到的那样,上面的方法有效,尽管它不被视为打包项目的正确方法。要更深入地了解这一点,请阅读页面 How to package a Python App。
另一种解决方案是将您要导入的任何内容的导入语句放入 try/except 块中,因此如果它有效,它就会被安装,但如果无效,它会抛出异常,您可以 运行 安装它的命令。
如果您想知道某个软件包是否已安装,您可以在终端中使用以下命令进行检查:
pip list | grep <module_name_you_want_to_check>
这是如何工作的:
pip list
列出安装在 Python 中的所有模块。
竖线|通常被称为“管道”。它用于将一个命令通过管道传输到另一个命令。也就是说,它将第一个命令的输出定向到第二个命令的输入。
grep <module_name_you_want_to_check>
从列表中找到关键字。
示例:
pip list| grep quant
列出所有以“quant”开头的软件包(例如“quantstrats”)。如果你没有任何输出,这意味着库没有安装。
您可以使用 pkg_resources.get_distribution
:
import pkg_resources
for package in ['mutagen', 'gTTS']:
try:
dist = pkg_resources.get_distribution(package)
print('{} ({}) is installed'.format(dist.key, dist.version))
except pkg_resources.DistributionNotFound:
print('{} is NOT installed'.format(package))
注意:您不应该直接导入 pip
模块作为 pip
命令的 it is an unsupported use-case。
recommended way of using pip
from your program is to execute it using subprocess
:
subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'my_package'])
你可以使用简单的 try/except:
try:
import mutagen
print("module 'mutagen' is installed")
except ModuleNotFoundError:
print("module 'mutagen' is not installed")
# or
install("mutagen") # the install function from the question
如果您想预览是否安装了特定的包(或某些包),也许您可以使用 python 中的空闲。 具体来说:
- 打开闲置
- 浏览到文件 > 打开模块 > 一些模块
- IDLE 将显示模块或提示错误消息。
以上是使用 python 3.9.0
测试的你可以运行pip show package_name
或广阔的视野 use pip list
Reference
尽管@girrafish 的回答可能就足够了,您也可以通过 importlib
检查软件包安装:
import importlib
packages = ['mutagen', 'gTTS']
[subprocess.check_call(['pip', 'install', pkg])
for pkg in packages if not importlib.util.find_spec(pkg)]