检查是否安装了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 )。