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
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.
另一个替代try的import在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通过导入一次将它们添加到字典中。
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)
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)
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)
为了完成,提供另一个答案:
您可以(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它的目的;但如果你想快速测试,它是需要最少输入的方法:-)
我用 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)
我发现,为了使我的基础设施配置**具有幂等性,我需要能够在 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)
** 我意识到Chef、puppet和ansible都有用于管理 python 包的插件,但您可能会发现自己处于像我这样的情况,您正在使用过时的版本并且不想使用已弃用的插件。