如果检查Python包装
-
20-08-2019 - |
题
什么是一个很好的方式来检查如果一个软件安装,同时在蟒蛇剧本吗?我知道这很容易从解释,但我需要做的,它在一个脚本。
我想我可以看看有没有目录的系统,该系统在安装期间创建的,但我觉得有个更好的办法。我试图确保Skype4Py包装,如果不是我来安装。
我的想法完成检查
- 检查的一个目录的典型安装的路径
- 试图进口包装,如果一个例外是扔掉,然后安装的包
解决方案
如果你的意思是蟒蛇脚本,只是做这样的事情:
try:
import mymodule
except ImportError, e:
pass # module doesn't exist, deal with it.
其他提示
更新后的回答
一个更好的办法,这样做是:
import subprocess
import sys
reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
installed_packages = [r.decode().split('==')[0] for r in reqs.split()]
其结果是:
print(installed_packages)
[
"Django",
"six",
"requests",
]
如果检查 requests
安装:
if 'requests' in installed_packages:
# Do something
为什么这样?有时候你有应用程序名称冲突。进口从应用程序的名字空间不会给你充分的图片什么的上安装的系统。
老答案
一个更好的办法,这样做是:
import pip
installed_packages = pip.get_installed_distributions()
Pip>=10.x使用:
from pip._internal.utils.misc import get_installed_distributions
为什么这样?有时候你有应用程序名称冲突。进口从应用程序的名字空间不会给你充分的图片什么的上安装的系统。
结果,你会得到一个列表中的 pkg_resources.Distribution
对象。请参阅以下为例:
print installed_packages
[
"Django 1.6.4 (/path-to-your-env/lib/python2.7/site-packages)",
"six 1.6.1 (/path-to-your-env/lib/python2.7/site-packages)",
"requests 2.5.0 (/path-to-your-env/lib/python2.7/site-packages)",
]
编列的:
flat_installed_packages = [package.project_name for package in installed_packages]
[
"Django",
"six",
"requests",
]
如果检查 requests
安装:
if 'requests' in flat_installed_packages:
# Do something
作为Python3.3,可以使用 find_spec() 方法
import importlib.util
import sys
# For illustrative purposes.
package_name = 'pandas'
spec = importlib.util.find_spec(package_name)
if spec is None:
print(package_name +" is not installed")
如果你想拥有的检查从终端中,可以运行
pip3 show package_name
如果没有返回,包没有安装。
也许如果你想自动执行这种检查,因此,例如,你可以安装它如果缺少的,你可以有以下在庆典脚本:
pip3 show package_name 1>/dev/null #pip for Python 2
if [ $? == 0 ]; then
echo "Installed" #Replace with your actions
else
echo "Not Installed" #Replace with your actions, 'pip3 install --upgrade package_name' ?
fi
作为一个延伸的 这个答案:
为蟒蛇2.*, pip show <package_name>
将执行相同的任务。
例如 pip show numpy
将返回以下或者:
Name: numpy
Version: 1.11.1
Summary: NumPy: array processing for numbers, strings, records, and objects.
Home-page: http://www.numpy.org
Author: NumPy Developers
Author-email: numpy-discussion@scipy.org
License: BSD
Location: /home/***/anaconda2/lib/python2.7/site-packages
Requires:
Required-by: smop, pandas, tables, spectrum, seaborn, patsy, odo, numpy-stl, numba, nfft, netCDF4, MDAnalysis, matplotlib, h5py, GridDataFormats, dynd, datashape, Bottleneck, blaze, astropy
你可以使用的pkg_resources模块从设置工具.例如:
import pkg_resources
package_name = 'cool_package'
try:
cool_package_dist_info = pkg_resources.get_distribution(package_name)
except pkg_resources.DistributionNotFound:
print('{} not installed'.format(package_name))
else:
print(cool_package_dist_info)
注意到之间是有区别的蟒蛇模块和一个python包。一个软件包可以包含多个模块,模块中的名称可能不匹配软件包的名称。
我想添加一些想法/调查结果我到这个话题。我写脚本,检查所有要求定制的程序。有许多检查与python模块。
有一个小问题
try:
import ..
except:
..
解决方案。在我的情况的一个python模块叫 python-nmap
, 但是你进它与 import nmap
和如你看到的名字不匹配。因此,测试与上述解决方案返回一个虚假的结果,它还进口的模块打击,但也许没有必要使用大量的存储器,用于简单的测/检查。
我还发现
import pip
installed_packages = pip.get_installed_distributions()
installed_packages
会有 唯一的软件包已 安装pip.在我的系统 pip freeze
回报 40
蟒蛇的模块,同时 installed_packages
只有 1
, 我安装了手动(蟒蛇常).
另一个解决方案下,我知道 可以不相关的问题, 但我认为这是一个很好的做法 保持试验的功能分开的 从一个执行安装可能会被用于一些。
该解决方案,为我工作。它基于这样的回答 如何检查,如果一个python模块的存在没有进口这
from imp import find_module
def checkPythonmod(mod):
try:
op = find_module(mod)
return True
except ImportError:
return False
注:这个解决方案不能找到该模块通过的名字 python-nmap
太,我已经使用 nmap
而不是(生),但在这种情况的模块不会被加载到存储的任何责任。
如果你想让你的剧本对安装缺少的软件包,并继续,你可以做像这样的东西(在例的'krbV'模块'python krbV'包装件):
import pip
import sys
for m, pkg in [('krbV', 'python-krbV')]:
try:
setattr(sys.modules[__name__], m, __import__(m))
except ImportError:
pip.main(['install', pkg])
setattr(sys.modules[__name__], m, __import__(m))
一个快速方法是使用 蟒蛇 命令行工具。简单的类型 import <your module name>
你看到一个错误,如果模块失踪。
$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
>>> import sys
>>> import jocker
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named jocker
$
去选择#2.如果 ImportError
被抛出,则包装是没有安装(或不在 sys.path
).