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

sig*_*jog 109 python command-line software-installation

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

  • 如果没有安装,如何安装?
  • 我怎么知道它是否已经安装?

sou*_* c. 90

如何知道系统中是否安装了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
Run Code Online (Sandbox Code Playgroud)

如果没有安装,我将如何安装它

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

sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3
Run Code Online (Sandbox Code Playgroud)

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

pip install numpy
Run Code Online (Sandbox Code Playgroud)

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

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

  • 是的,它就在您的系统中。 (2认同)

Tak*_*kat 29

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

在python shell问题中:

>>> import sys
Run Code Online (Sandbox Code Playgroud)

然后测试已安装的模块:

>>> 'numpy' in sys.modules
True
>>> 'scipy' in sys.modules
False
Run Code Online (Sandbox Code Playgroud)

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

另一个替代tryimport在Python控制台语句调用内置的help()功能。这不会提供未安装模块的文档,例如

>>> help('scipy')
no Python documentation found for 'scipy'
Run Code Online (Sandbox Code Playgroud)

已安装模块的很长帮助文档的输出可以中断Q

现在要安装缺少的模块,建议使用Ubuntu 包管理(而不是 Python pip 方式),因为我们需要 root 访问权限并防止弄乱我们严重依赖 Python 的系统。对于有问题的模块,例如:

sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3
Run Code Online (Sandbox Code Playgroud)

安装后,我们可以sys.modules通过导入一次将它们添加到字典中。

  • 看来还是不够清楚。鉴于问题是询问如何确定模块是否已_安装_(而不是_导入_),`sys.modules` 完全无关,我认为任何提及它都会产生误导。但也许这只是我。 (4认同)
  • 第一部分是错误的:`sys.modules` 只包含*已经导入*的模块,因此它不是测试模块是否已安装的可靠方法。最可靠的测试是使用 `try/except` 并捕获 `ImportError`,正如其他几个人已经建议的那样。 (3认同)
  • `sys.modules` 在这里没有任何帮助。 (2认同)

cuo*_*glm 20

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

python -c 'import pkgutil; print(1 if pkgutil.find_loader("module") else 0)'
Run Code Online (Sandbox Code Playgroud)

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

$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)'
1
Run Code Online (Sandbox Code Playgroud)

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

Ooz*_*ter 16

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

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

pip freeze
Run Code Online (Sandbox Code Playgroud)

甚至

pip list
Run Code Online (Sandbox Code Playgroud)

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

如果你要找的模块没有安装,大多数时候你可以用 pip 轻松安装它:

pip install <module-name>
Run Code Online (Sandbox Code Playgroud)

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

pip search <keyword>
Run Code Online (Sandbox Code Playgroud)

  • 另外,“pip show &lt;module-name&gt;”将显示是否安装了软件包,例如“pip show numpy”。 (2认同)

Avi*_*Raj 13

您可以将代码放在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
Run Code Online (Sandbox Code Playgroud)
$ python3 -c "\
try:
    import regex
    print('\nModule was installed')
except ImportError:
    print('\nThere was no such module installed')"

Module was installed
Run Code Online (Sandbox Code Playgroud)


Mar*_*oij 8

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

您可以(ab)使用该-m选项。从 Python 的联机帮助页:

   -m module-name
          Searches sys.path for the named module and runs the  correspond?
          ing .py file as a script.
Run Code Online (Sandbox Code Playgroud)

这会给我们:

$ 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
Run Code Online (Sandbox Code Playgroud)

但是对于不存在的模块,它会给我们:

$ python2 -m doesnt_exist
/sbin/python2: No module named doesnt_exist
Run Code Online (Sandbox Code Playgroud)

我们可以用它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
Run Code Online (Sandbox Code Playgroud)

这有点骇人听闻,而不是-m它的目的;但如果你想快速测试,它是需要最少输入的方法:-)

  • `grep -q` 不需要重定向到 null。 (4认同)
  • @muru 哎呀!这些年来,我输入了很多无用的重定向到 `/dev/null` :-/ (4认同)

Mon*_*lal 5

我用 Python 写了一个例子:

import pip
import sys
from bigml.api import BigML


if not 'bigml' in sys.modules.keys():
    pip.main(['install', 'bigml'])
Run Code Online (Sandbox Code Playgroud)


Bru*_*sky 5

Shell oneliner 检查(对于配置很有用)

我发现,为了使我的基础设施配置**具有幂等性,我需要能够在 oneliner 中检查 shell 中的包。我以@cuonglm 的答案为基础。我必须反转1and0因为我正在生成退出状态而不是打印字符串。

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader(sys.argv[1]) else 1)" pymongo
Run Code Online (Sandbox Code Playgroud)

您可以将 替换sys.argv[1]为包的单引号名称,但对于我的配置脚本,我喜欢将其放在末尾的可读性。

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('pymongo') else 1)"
Run Code Online (Sandbox Code Playgroud)

** 我意识到Chefpuppetansible都有用于管理 python 包的插件,但您可能会发现自己处于像我这样的情况,您正在使用过时的版本并且不想使用已弃用的插件。