首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >检查是否安装了Python包

检查是否安装了Python包
EN

Stack Overflow用户
提问于 2009-06-27 04:54:38
回答 18查看 209.9K关注 0票数 139

在Python脚本中检查包是否已安装的好方法是什么?我知道这在解释器中很简单,但我需要在脚本中完成。

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

我对完成检查的想法

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

回答 18

Stack Overflow用户

回答已采纳

发布于 2009-06-26 21:00:18

如果您指的是python脚本,只需执行以下操作:

Python 3.3+使用sys.modules和find_spec

代码语言:javascript
复制
import importlib.util
import sys

# For illustrative purposes.
name = 'itertools'

if name in sys.modules:
    print(f"{name!r} already in sys.modules")
elif (spec := importlib.util.find_spec(name)) is not None:
    # If you choose to perform the actual import ...
    module = importlib.util.module_from_spec(spec)
    sys.modules[name] = module
    spec.loader.exec_module(module)
    print(f"{name!r} has been imported")
else:
    print(f"can't find the {name!r} module")

Python 3:

代码语言:javascript
复制
try:
    import mymodule
except ImportError as e:
    pass  # module doesn't exist, deal with it.

Python 2:

代码语言:javascript
复制
try:
    import mymodule
except ImportError, e:
    pass  # module doesn't exist, deal with it.
票数 136
EN

Stack Overflow用户

发布于 2014-12-16 09:29:25

更新的答案

一种更好的方法是:

代码语言:javascript
复制
import subprocess
import sys

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

结果是:

代码语言:javascript
复制
print(installed_packages)

[
    "Django",
    "six",
    "requests",
]

检查是否安装了requests

代码语言:javascript
复制
if 'requests' in installed_packages:
    # Do something

为什么是这种方式?有时,您会遇到应用程序名称冲突。从app命名空间导入并不能让您全面了解系统上安装的内容。

请注意,建议的解决方案是可行的:

当使用pip从PyPI或任何其他替代来源(如pip install http://some.site/package-name.zip或任何其他存档类型)安装时,请使用

  • 。使用python setup.py install手动安装时的
  • 。从系统存储库(如sudo apt install python-requests )安装时的

it not work的情况:

在开发模式下安装时的

  • ,类似于在开发模式下安装的python setup.py develop.
  • When,如pip install -e /path/to/package/source/.

老答案

一种更好的方法是:

代码语言:javascript
复制
import pip
installed_packages = pip.get_installed_distributions()

对于pip>=10.x使用:

代码语言:javascript
复制
from pip._internal.utils.misc import get_installed_distributions

为什么是这种方式?有时,您会遇到应用程序名称冲突。从app命名空间导入并不能让您全面了解系统上安装的内容。

因此,您将获得一个pkg_resources.Distribution对象列表。下面是一个例子:

代码语言:javascript
复制
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)",
]

把它列出来:

代码语言:javascript
复制
flat_installed_packages = [package.project_name for package in installed_packages]

[
    "Django",
    "six",
    "requests",
]

检查是否安装了requests

代码语言:javascript
复制
if 'requests' in flat_installed_packages:
    # Do something
票数 64
EN

Stack Overflow用户

发布于 2017-01-24 05:23:05

从Python3.3开始,您可以使用find_spec()方法

代码语言:javascript
复制
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")
票数 60
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1051254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档