如何检查模块是否安装在Python中,并在需要时安装它?
在终端中,在我启动Python之后,我怎么知道python中存在哪些模块? 假设我需要学习NumPy和SciPy模块。
- 如果没有安装,我将如何安装?
- 我怎么知道它是否已安装?
如何知道系统中是否安装了python模块:您可以在终端中进行非常简单的测试,
$ python -c "import math" $ echo $? 0 # math module exists in system $ python -c "import numpy" Traceback (most recent call last): File "", line 1, in ImportError: No module named numpy $ echo $? 1 # numpy module does not exist in system
如果没有安装,我将如何安装它
您可以通过从存储库下载相应的软件包来安装特定的模块,例如,您可以安装scipy
as,
sudo apt-get install python-scipy ## for Python2 sudo apt-get install python3-scipy ## for Python3
或者您也可以使用python-pip
安装python模块,如下面的评论中由Zack Titan所建议的,要安装numpy
您可以使用
pip install numpy
警告:强烈建议仅使用官方Ubuntu存储库安装python-modules,而不是以超级用户身份使用pip
方法(即以root
身份或使用sudo
)。 在某些情况下,它可能会破坏系统python而使您的系统无法使用。
如何使用pip
将软件包安装到本地虚拟环境中。
如果我们不想不想要地导入有问题的模块(这将在try
语句中发生),我们可以使用sys.modules
来测试之前安装和导入的模块。
在python shell问题中:
>>> import sys
然后测试已安装的模块:
>>> 'numpy' in sys.modules True >>> 'scipy' in sys.modules False
请注意,只有那些之前导入的模块在此测试中给出True
,所有其他模块(即使已安装)都会导致False.
在python控制台中try
import
语句的另一种方法是调用内置的help()
函数。 这不会给出未安装模块的文档,例如
>>> help('scipy') no Python documentation found for 'scipy'
Q可以中断已安装模块的很长帮助文档的输出。
现在要安装缺少的模块,建议使用Ubuntu包管理 (而不是Python pip方式),因为我们需要root访问权限,并且还要防止搞乱我们庞大的Python依赖系统。 对于有问题的模块,这将是例如:
sudo apt-get install python-scipy ## for Python2 sudo apt-get install python3-scipy ## for Python3
安装完成后,我们可以通过导入一次将它们添加到sys.modules
字典中。
另一种方法是pkgutil
模块。 适用于Python 2和3:
python -c 'import pkgutil; print(1 if pkgutil.find_loader("module") else 0)'
您需要将module
替换为module
的名称,例如:
$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)' 1
我知道OP最初在启动Python后要求解决方案,但在python之外我使用pip
。 在ubuntu上: sudo apt-get install python-pip
,如果还没有安装的话。
然后,要查看可用的第三方模块,只需运行:
pip freeze
甚至
pip list
两者都将向您展示所有安装的模块及其版本。
如果未安装您正在寻找的模块,大多数情况下您可以使用pip轻松安装它:
pip install
如果您不确定模块是否存在或其PyPI名称是什么,请使用pip search
:
pip search
您可以将代码放在try
, except
块。
$ python3 -c "\ try: import cow print('\nModule was installed') except ImportError: print('\nThere was no such module installed')" There was no such module installed
$ python3 -c "\ try: import regex print('\nModule was installed') except ImportError: print('\nThere was no such module installed')" Module was installed
为完成起见,提供另一个答案:
您可以(ab)使用-m
选项。 从Python的手册页:
-m module-name Searches sys.path for the named module and runs the correspond‐ ing .py file as a script.
哪个会给我们:
$ python2 -m numpy /sbin/python2: No module named numpy.__main__; 'numpy' is a package and cannot be directly executed $ python2 -m math /sbin/python2: No code object available for math
但是对于不存在的模块,它会给我们:
$ python2 -m doesnt_exist /sbin/python2: No module named doesnt_exist
我们可以使用grep
匹配这个:
$ python2 -m doesnt_exist |& grep -q 'No module named' && echo 'Nope' || echo 'Yup' Nope $ python2 -m math |& grep -q 'No module named' && echo 'Nope' || echo 'Yup' Yup
这有点骇人听闻,而不是-m
用途; 但如果你想快速测试,这是需要最少打字的方法:-)
我在Python中写了一个例子:
import pip import sys from bigml.api import BigML if not 'bigml' in sys.modules.keys(): pip.main(['install', 'bigml'])
Shell oneliner check(对配置很有用)
我发现为了使我的基础设施配置**幂等,我需要能够在oneliner中检查shell中的包。 我建立在@ cuonglm的答案上。 我不得不反转1
和0
因为我正在生成退出状态而不是打印字符串。
python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader(sys.argv[1]) else 1)" pymongo
您可以使用包的单引号替换sys.argv[1]
,但对于我的配置脚本,我喜欢在最后使用它的可读性。
python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('pymongo') else 1)"
**我意识到厨师 , 木偶和ansible都有用于管理python包的插件,但你可能会发现自己处于像我这样使用过时版本并且不想使用已弃用的插件的情况。
也可以使用pydoc modules
,可以使用grep
过滤来查找特定模块。 输出以列式格式显示。 这种方法的唯一缺点是它还将在当前工作目录中包含python文件。 尽管如此,我大多数时候都是自己使用它,这是这个相关问题上被高度引用的方法之一: https : //stackoverflow.com/q/739993/3701431