如何检查是否安装了python_检查是否安装了Python Package

检查是否安装了Python Package

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

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

我完成检查的想法

检查典型安装路径中的目录

尝试导入包,如果抛出异常,则安装包

10个解决方案

82 votes

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

try:

import mymodule

except ImportError, e:

pass # module doesn't exist, deal with it.

Christopher answered 2019-09-16T21:10:42Z

40 votes

更新的答案

更好的方法是:

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

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

老答案

更好的方法是:

import pip

installed_packages = pip.get_installed_distributions()

对于pip> = 10.x使用:

from pip._internal.utils.misc import get_installed_distributions

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

因此,您将获得requests对象的列表。 请参阅以下示例:

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

Artur Barseghyan answered 2019-09-16T21:11:57Z

15 votes

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

pip3 show package_name

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

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

Ognjen Vukovic answered 2019-09-16T21:12:33Z

12 votes

从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")

ice.nicer answered 2019-09-16T21:12:57Z

4 votes

作为这个答案的延伸:

对于Python 2. *,pip show numpy将执行相同的任务。

例如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

KutalmisB answered 2019-09-16T21:13:33Z

2 votes

您可以使用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)

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

Lyudmil Nenov answered 2019-09-16T21:14:03Z

1 votes

我想在本主题中添加一些我的想法/发现。我正在编写一个脚本来检查自定义程序的所有要求。 python模块也有很多检查。

这有一个小问题

try:

import ..

except:

..

解。在我的情况下,其中一个python模块名为python-nmap,但你用nmap导入它,因为你看到名称不匹配。 因此,使用上述解决方案的测试返回False结果,并且它还在命中时导入模块,但可能不需要使用大量内存进行简单的测试/检查。

我也发现了

import pip

installed_packages = pip.get_installed_distributions()

python-nmap将只有已经安装了pip的软件包。在我的系统python-nmap返回nmap python模块,而installed_packages只有1,我手动安装(python-nmap)。

我知道下面的另一个解决方案可能与问题无关,但我认为将测试功能与执行安装的测试功能分开是一个很好的做法,它可能对某些人有用。

解决方案对我有用。 它基于这个答案如何检查python模块是否存在而不导入它

from imp import find_module

def checkPythonmod(mod):

try:

op = find_module(mod)

return True

except ImportError:

return False

注意:此解决方案也找不到名称python-nmap的模块,我必须使用nmap(易于使用)但在这种情况下模块将不会被加载到内存中。

Gergely M answered 2019-09-16T21:15:13Z

0 votes

如果您希望脚本安装丢失的软件包并继续,您可以执行以下操作(例如'python-krbV'软件包中的'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))

Alexander Zhak answered 2019-09-16T21:15:38Z

0 votes

一种快速的方法是使用python命令行工具。只需输入import 如果缺少模块,则会看到错误。

$ python

Python 2.7.6 (default, Jun 22 2015, 17:58:13)

>>> import sys

>>> import jocker

Traceback (most recent call last):

File "", line 1, in

ImportError: No module named jocker

$

Deepu Sahni answered 2019-09-16T21:16:03Z

-1 votes

去选项#2。 如果抛出ImportError,则未安装包(或不在sys.path中)。

eduffy answered 2019-09-16T21:16:28Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python package 是一种用于组织并封装 Python 模块的方式,它可以包含多个模块、子包以及其他资源文件。使用 package 可以更好地组织代码,方便代码的复用和分发。 一个 Python package 是一个目录,其中包含一个名为 `__init__.py` 的文件,这个文件可以是空文件,也可以包含初始化 package 所需的代码。package 目录下可以包含其他 Python 模块文件或子包,子包也是一个 package,它可以再包含其他模块或子包。 例如,我们可以创建一个名为 `mypackage` 的 package,其中包含一个名为 `mymodule.py` 的模块文件: ``` mypackage/ __init__.py mymodule.py ``` 在 `mypackage/__init__.py` 中可以定义 package 的初始化代码,例如: ```python print("mypackage is being initialized") from . import mymodule ``` 在 `mypackage/mymodule.py` 中可以定义模块的代码,例如: ```python def hello(): print("Hello, world!") ``` 然后我们可以在其他 Python 代码中导入 `mypackage.mymodule` 模块并调用其中的函数: ```python import mypackage.mymodule mypackage.mymodule.hello() ``` 或者使用相对导入: ```python from . import mymodule mymodule.hello() ``` 注意,如果 package 中包含子包,需要在子包目录下创建一个空的 `__init__.py` 文件以标识这是一个 package。例如,我们可以创建一个名为 `mypackage/mysubpackage` 的子包,其中包含一个名为 `mysubmodule.py` 的模块文件: ``` mypackage/ __init__.py mymodule.py mysubpackage/ __init__.py mysubmodule.py ``` 在 `mypackage/mysubpackage/__init__.py` 中可以定义子包的初始化代码,例如: ```python print("mysubpackage is being initialized") from . import mysubmodule ``` 在 `mypackage/mysubpackage/mysubmodule.py` 中可以定义子模块的代码,例如: ```python def goodbye(): print("Goodbye, world!") ``` 然后我们可以在其他 Python 代码中导入 `mypackage.mysubpackage.mysubmodule` 模块并调用其中的函数: ```python import mypackage.mysubpackage.mysubmodule mypackage.mysubpackage.mysubmodule.goodbye() ``` 或者使用相对导入: ```python from . import mysubmodule mysubmodule.goodbye() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值