检查是否安装了Python包
在Python脚本中检查程序包是否安装的好方法是什么? 我知道翻译很容易,但我需要在脚本中完成。
我想我可以检查系统中是否有安装过程中创build的目录,但我觉得有一个更好的方法。 我试图确保Skype4Py软件包已安装,如果没有,我会安装它。
我完成检查的想法
- 检查典型安装path中的目录
- 尝试导入包,如果抛出exception,则安装包
如果你的意思是一个Python脚本,只要做这样的事情:
try: import mymodule except ImportError, e: pass # module doesn't exist, deal with it.
更好的方法是:
import pip installed_packages = pip.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
从Python 3.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")
如果你想从terminal上进行检查,你可以运行
pip3 show package_name
如果没有返回,则不安装该软件包。
如果也许你想自动执行这个检查,例如你可以安装它,如果缺less,你可以在你的bash脚本中有以下内容:
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
我想添加一些我的想法/发现这个话题。 我正在编写一个脚本来检查一个自定义程序的所有需求。 Python模块也有很多检查。
有一个小问题
try: import .. except: ..
解。 在我的情况下,一个名为python-nmap
的python模块,但是你用import nmap
导入它,并且你看到名称不匹配。 因此,使用上述解决scheme进行的testing会返回一个False结果,并且还会在命中时导入该模块,但可能不需要使用大量内存进行简单的testing/检查。
我也发现了
import pip installed_packages = pip.get_installed_distributions()
installed_packages
将只有与pip一起安装的软件包。 在我的系统上, pip freeze
返回超过40
python模块,而installed_packages
只有1
,我手动安装的(python-nmap)。
下面的另一个解决scheme,我知道它可能不相关的问题 ,但我认为这是一个很好的做法, 保持testingfunction分开执行安装它可能是有用的一些。
为我工作的解决scheme。 它基于这个答案如何检查是否存在一个python模块而不导入它
from imp import find_module def checkPythonmod(mod): try: op = find_module(mod) return True except ImportError: return False
注意:这个解决scheme也无法通过名称python-nmap
来find模块,我必须使用nmap
(易于使用),但在这种情况下,模块将不会被加载到内存中。
去选项#2。 如果引发ImportError
,那么软件包没有安装(或不在sys.path
)。