Answers:
如何知道系统中是否安装了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可能会使您的系统无法使用。root
sudo
vpython
您需要以sudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
sudo pip
; 它可能会破坏系统python。使用apt-get为系统python安装软件包。您可以使用pip --user
option或virtualenv自己安装Python软件包。
如果我们不想不必要地导入有问题的模块(这将在try
语句中发生),我们可以利用它sys.modules
来测试之前安装和导入的模块。
在python shell问题中:
>>> import sys
然后测试安装的模块:
>>> 'numpy' in sys.modules
True
>>> 'scipy' in sys.modules
False
请注意,只有那些之前导入的模块才能True
进行此测试,所有其他模块(即使已安装)也会导致False.
另一个替代try
的import
在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
通过一次导入将它们添加到字典中。
sys.modules
仅包含已导入的模块,因此这不是测试模块是否已安装的可靠方法。正如其他几个建议一样,最可靠的测试是使用try/except
和捕获the ImportError
。
sys.modules
因此完全无关紧要,我认为对此的任何提及都具有误导性。但是也许就是我。
sys.modules
在这里没有任何帮助。
另一种方法是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
print()
在Python 2中也可以正常工作;它被视为带有parens的组语法,并且没有任何副作用。仅当您要添加多个项目时(因为print('a', 'b')
它将确实被视为tuple
,其中您确实需要from __future__ import print_function
,但在这种情况下不适用),您可以通过添加括号来编写向前兼容的代码(我测试了更改在Python 2和3)。
我知道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>
pip show <module-name>
还将显示是否已安装软件包,例如pip show numpy
。
您可以将代码放入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
本来打算的。但这是您需要快速测试的最少输入方法:-)
grep -q
无需重定向到null。
/dev/null
:-/
我用Python编写了一个示例:
import pip
import sys
from bigml.api import BigML
if not 'bigml' in sys.modules.keys():
pip.main(['install', 'bigml'])
我发现,为了使我的基础结构配置**具有幂等性,我需要能够从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)"
**我认识到Chef,puppet和ansible都具有用于管理python软件包的插件,但是您可能会遇到像我这样的情况,即您正在使用过时的版本,并且不想使用不推荐使用的插件。
也可以使用pydoc modules
进行筛选,grep
以查找特定的模块。输出以列格式显示。这种方法的唯一缺点是它还将在当前工作目录中包含python文件。尽管如此,我大部分时间都是自己使用它,这是有关此问题的被高度引用的方法之一:https : //stackoverflow.com/q/739993/3701431
撰写本文时,这pip show ...
似乎是最简单的方法:https :
//pip.pypa.io/en/stable/reference/pip_show/
但是,在未安装软件包时,它是静默的(即不返回任何内容)。