如何检查是否在Python中安装了模块,并在需要时进行安装?


89

在终端中,启动Python之后,我如何知道python中存在哪些模块?假设我需要学习NumPy和SciPy模块。

  • 如果未安装该如何安装?
  • 我怎么知道它是否已经安装?

Answers:


73

如何知道系统中是否安装了python模块:您可以在终端中进行非常简单的测试,

$ python -c "import math"
$ echo $?
0                                # math module exists in system

$ python -c "import numpy"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named numpy
$ echo $?
1                                # numpy module does not exist in system

如果未安装该如何安装

您可以通过从存储库下载相应的软件包来安装特定的模块,例如,您可以安装scipy

sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3

或者,您也可以python-pip按照Zack Titan在下面注释中的建议使用来安装python模块,要安装,numpy您可以使用

pip install numpy

警告:强烈建议仅使用官方Ubuntu存储库安装python-modules,而不要以超级用户的身份使用该pip方法(即as 或using )。在某些情况下,通过破坏系统python可能会使您的系统无法使用。rootsudo

如何使用软件包安装pip到本地虚拟环境中。


就像在您的答案中存在数学模块一样,对于numby,没有出现追溯,对于echo $?输出为0,是否表示我的系统中还存在numpy?
TechJhola 2015年

1
是的,它存在于您的系统中。
souravc

如果您没有numpy模块,您将如何导入它?当我们进行编码时,我们通过numpy import *调用import语句,它将安装模块吗?如果没有,我们将如何安装新模块?
TechJhola 2015年

1
如何安装模块将是一个单独的问题。需要针对不同模块的不同包装。例如,要安装,vpython您需要以sudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
souravc

1
不要用sudo pip; 它可能会破坏系统python。使用apt-get为系统python安装软件包。您可以使用pip --useroption或virtualenv自己安装Python软件包。
jfs 2015年

21

如果我们不想不必要地导入有问题的模块(这将在try语句中发生),我们可以利用它sys.modules来测试之前安装导入的模块。

在python shell问题中:

>>> import sys

然后测试安装的模块:

>>> 'numpy' in sys.modules
True
>>> 'scipy' in sys.modules
False

请注意,只有那些之前导入的模块才能True进行此测试,所有其他模块(即使已安装)也会导致False.

另一个替代tryimport在Python控制台语句调用内置的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通过一次导入将它们添加到字典中。


1
我觉得这是最Python化的答案....
Grijesh肖汉

3
第一部分是错误的:sys.modules仅包含已导入的模块,因此这不是测试模块是否已安装的可靠方法。正如其他几个建议一样,最可靠的测试是使用try/except和捕获the ImportError
ekhumoro 2015年

@ekhumoro-谢谢,我将编辑我的答案以使其更清楚。
塔卡特2015年

4
似乎仍然不够清楚。鉴于问题是询问如何找出是否已安装模块(不是import),sys.modules因此完全无关紧要,我认为对此的任何提及都具有误导性。但是也许就是我。
David Z

1
sys.modules在这里没有任何帮助。

19

另一种方法是pkgutil模块。适用于Python 2和3:

python -c 'import pkgutil; print(1 if pkgutil.find_loader("module") else 0)'

您需要module用模块名称替换,例如:

$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)'
1

2
我看到你取消了我的一些更改;print()在Python 2中也可以正常工作;它被视为带有parens的组语法,并且没有任何副作用。仅当您要添加多个项目时(因为print('a', 'b')它将确实被视为tuple,其中您确实需要from __future__ import print_function,但在这种情况下不适用),您可以通过添加括号来编写向前兼容的代码(我测试了更改在Python 2和3)。
马丁Tournoij

@Carpetsmoker:感谢您指出。我回滚到旧版本。
cuonglm

这是一个很好的答案。我添加了一个派生答案,该答案返回退出/状态代码(用于Shell脚本流控制),并将模块名称作为命令行参数。askubuntu.com/a/891384/146273
Bruno Bronosky

可行!-只需更改为exit以便可以在shell上下文中使用:python -c 'import pkgutil; exit(0 if pkgutil.find_loader("math") else 2)'
AT

12

我知道OP在启动Python之后最初要求解决方案,但我在python之外使用pip。在ubuntu上:sudo apt-get install python-pip,如果尚未安装。

然后查看可用的第三方模块,只需运行:

pip freeze

甚至

pip list

两者都将显示所有已安装的模块及其版本。

如果您要查找的模块未安装,大多数时候您可以使用pip轻松安装它:

pip install <module-name>

如果不确定模块是否存在或其PyPI名称是什么,请使用pip search

pip search <keyword>

1
此外,pip show <module-name>还将显示是否已安装软件包,例如pip show numpy
疱疹免费工程师

10

您可以将代码放入tryexcept块中。

$ 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

6

为了完成起见,提供另一个答案:

您可以(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本来打算的。但这是您需要快速测试的最少输入方法:-)


4
grep -q无需重定向到null。
muru 2015年

3
@muru Yikes!多年来,我输入了许多无用的重定向/dev/null:-/
Martin Tournoij 2015年

4

我用Python编写了一个示例:

import pip
import sys
from bigml.api import BigML


if not 'bigml' in sys.modules.keys():
    pip.main(['install', 'bigml'])

3

Shell oneliner检查(用于配置)

我发现,为了使我的基础结构配置**具有幂等性,我需要能够从oneliner的外壳中检查软件包。我建立在@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)"

**我认识到Chefpuppetansible都具有用于管理python软件包的插件,但是您可能会遇到像我这样的情况,即您正在使用过时的版本,并且不想使用不推荐使用的插件。



0

在Ubuntu Shell中,默认情况下为bash,就像

pip list | grep <package-name-Case-Matters>

例子

pip list | grep pywinrm

pip list | grep numpy

而且,如果您对此情况有疑问(尽管我认为所有程序包名称始终都是小写):

pip list | grep [Nn]um[Pp]y  # it works with numpy, Numpy, numPy, and NumPy

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.