在Python脚本中有什么好方法可以检查包是否已安装?我知道在解释器中很容易,但我需要在脚本中执行。
我猜我可以检查系统上是否有在安装期间创建的目录,但我觉得有更好的方法。 我试图确保Skype4Py包已安装,如果没有,我将安装它。
我的检查实现想法:
- 检查典型安装路径中是否存在目录
- 尝试导入包并抛出异常,然后再安装包
在Python脚本中有什么好方法可以检查包是否已安装?我知道在解释器中很容易,但我需要在脚本中执行。
我猜我可以检查系统上是否有在安装期间创建的目录,但我觉得有更好的方法。 我试图确保Skype4Py包已安装,如果没有,我将安装它。
我的检查实现想法:
如果您想使用Python脚本,只需像这样做:
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")
try:
import mymodule
except ImportError as e:
pass # module doesn't exist, deal with it.
try:
import mymodule
except ImportError, e:
pass # module doesn't exist, deal with it.
从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")
importlib.util.find_spec('google-cloud-logging')
找不到任何东西,而 importlib.util.find_spec('google.cloud.logging')
可以找到。官方名称和pip显示的名称都带有破折号而不是点号。这可能会令人感到困惑,因此请谨慎使用。 - dwich更好的方法是:
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
pip install http://some.site/package-name.zip
或任何其他档案类型)安装时。
python setup.py install
。
sudo apt install python-requests
。
python setup.py develop
。
pip install -e / path / to / package / source /
。
更好的方法是:
import pip
installed_packages = pip.get_installed_distributions()
对于pip>=10.x,请使用:
from pip._internal.utils.misc import get_installed_distributions
为什么这样做?有时会出现应用程序名称冲突。从app命名空间导入,不能完全了解系统上安装了什么。
因此,您会得到一个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
import json
实际上正在工作时返回False)。在这种情况下,可以采用ice.nicer的方法。 - mountrixif“u'requests'”in installed_packages:
才能让它对我起作用。在我的macOS python上,print()
的输出如下:[..., u'pytz', u'requests', ...]
。 - Bujuif "requests'"
(注意末尾的单引号)。这根本没有意义。 - Bujupip
。例如,您可以从源代码构建和安装软件包。这个答案无法找到那些。@ice.nicer关于find_spec()
的答案是正确的。 - Arthur如果您想从终端获取检查结果,可以运行以下命令
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
if
直接测试成功的命令:if pip3 show package_name 1>/dev/null; then ...
- MestreLion打开命令提示符并输入
pip3 list
在终端中输入以下命令:
pip show some_package_name
例子
pip show matplotlib
作为这个回答的延伸:
对于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
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)
magic
的模块,但它们的接口彼此不兼容。此外,在 3.8 版本中添加了 importlib.metadata,我认为它非常方便。 - ish-west要查找包是否存在,请使用pip3 list命令。
#**pip3 list** will display all the packages and **grep** command will search for a particular package
pip3 list | grep your_package_name_here
You can use ImportError
try:
import your_package_name
except ImportError as error:
print(error,':( not found')
!pip install your_package_name
import your_package_name
...
...
if pip list | grep -q \^'PACKAGENAME\s'
# installed ...
else
# not installed ...
fi