检查是否安装了Python Package

Kev*_*vin 90 python skype package python-import

在Python脚本中检查包是否安装的好方法是什么?我知道解释器很容易,但是我需要在脚本中完成它.

我想我可以检查系统中是否有安装过程中创建的目录,但我觉得有更好的方法.我正在尝试确保安装了Skype4Py软件包,如果没有,我会安装它.

我完成检查的想法

  • 检查典型安装路径中的目录
  • 尝试导入包,如果抛出异常,则安装包

Chr*_*her 87

如果你的意思是python脚本,只需执行以下操作:

try:
 import mymodule
except ImportError, e:
 pass # module doesn't exist, deal with it.
Run Code Online (Sandbox Code Playgroud)

  • 这不仅*检查*; 它也进口它; 另见http://stackoverflow.com/questions/14050281/how-to-check-if-a-python-module-exists-without-importing-it (6认同)
  • 警告:我今天刚遇到导致模块本身抛出ImportError的情况.这不应该经常发生,但要注意这种检查在所有情况下都不可靠. (5认同)
  • 是.这通常是你想要的.您可以使用导入工具模块进行更复杂的检查,但大多数情况下,您关心安装模块的唯一原因是因为您想要使用它. (5认同)

Art*_*yan 49

更新的答案

更好的方法是:

import subprocess
import sys

reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
installed_packages = [r.decode().split('==')[0] for r in reqs.split()]
Run Code Online (Sandbox Code Playgroud)

结果:

print(installed_packages)

[
    "Django",
    "six",
    "requests",
]
Run Code Online (Sandbox Code Playgroud)

检查是否requests已安装:

if 'requests' in installed_packages:
    # Do something
Run Code Online (Sandbox Code Playgroud)

为什么这样?有时你有app name collisions.从应用程序命名空间导入并不能让您全面了解系统上安装的内容.

老答案

更好的方法是:

import pip
installed_packages = pip.get_installed_distributions()
Run Code Online (Sandbox Code Playgroud)

对于pip> = 10.x使用:

from pip._internal.utils.misc import get_installed_distributions
Run Code Online (Sandbox Code Playgroud)

为什么这样?有时你有app name collisions.从应用程序命名空间导入并不能让您全面了解系统上安装的内容.

结果,您获得了一个pip install http://some.site/package-name.zip对象列表.请参阅以下示例:

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)",
]
Run Code Online (Sandbox Code Playgroud)

列出它:

flat_installed_packages = [package.project_name for package in installed_packages]

[
    "Django",
    "six",
    "requests",
]
Run Code Online (Sandbox Code Playgroud)

检查是否python setup.py install已安装:

if 'requests' in flat_installed_packages:
    # Do something
Run Code Online (Sandbox Code Playgroud)

  • 如另一个答案中所述,错误可能未被捕获。因此,我认为这应该是公认的答案。 (2认同)
  • 这并没有回答以下问题:“是否安装了软件包‘x’?”。有很多方法可以在不使用“pip”的情况下安装软件包。例如,您可以从源代码制作并安装包。这个答案不会找到这些。@ice.nicer 关于“find_spec()”的答案是正确的。 (2认同)

ice*_*cer 24

从Python 3.3开始,您可以使用find_spec()方法

import importlib.util

# For illustrative purposes.
package_name = 'pandas'

spec = importlib.util.find_spec(package_name)
if spec is None:
    print(package_name +" is not installed")
Run Code Online (Sandbox Code Playgroud)

  • 当心。如果包名包含破折号,则 find_spec() 无法找到它,除非您使用点。示例:`importlib.util.find_spec('google-cloud-logging')` 在找到`importlib.util.find_spec('google.cloud.logging')` 时什么也没找到。pip 显示的正式名称和名称带有破折号,而不是点。可能会造成混淆,因此请谨慎使用。 (7认同)
  • 干净简单,最好的答案在这里。这需要更多的支持。 (3认同)

Ogn*_*vic 21

如果您想从终端进行检查,您可以运行

pip3 show package_name
Run Code Online (Sandbox Code Playgroud)

如果没有返回任何内容,则不会安装该软件包.

如果您想要自动执行此检查,那么例如,如果丢失则可以安装它,您可以在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
Run Code Online (Sandbox Code Playgroud)


And*_*rey 8

在终端类型中

pip show some_package_name
Run Code Online (Sandbox Code Playgroud)

例子

pip show matplotlib
Run Code Online (Sandbox Code Playgroud)


Her*_*eer 5

作为此答案的扩展:

对于Python 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
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用 setuptools 中的 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)
Run Code Online (Sandbox Code Playgroud)

请注意,python 模块和 python 包之间存在差异。一个包可以包含多个模块,并且模块的名称可能与包名称不匹配。


小智 5

打开您的命令提示符类型

pip3 list
Run Code Online (Sandbox Code Playgroud)