Answers:
如果您的意思是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.
更好的方法是:
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
为什么这样呢?有时您会遇到应用名称冲突。从应用程序名称空间导入无法全面了解系统上已安装的内容。
结果,您得到一个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的方法在这种情况下有效。
if "u'requests'" in installed_packages:
更新的答案”中的检查为我工作。print()
在我的macOS python上产生以下命令的输出:[..., u'pytz', u'requests', ...]
if "requests'"
(注意最后的单引号)。完全没有意义。
pip
。例如,您可以从源代码制作和安装软件包。这个答案找不到那些。@ ice.nicer的答案find_spec()
是正确的。
从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')
也找不到。点子显示的正式名称和名称用短划线而不是点号表示。可能会造成混淆,因此请谨慎使用。
如果要从终端机取支票,可以运行
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 ...
作为此答案的扩展:
对于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
您可以使用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包之间有区别。一个软件包可以包含多个模块,并且模块名称可能与软件包名称不匹配。
我想对此主题添加一些想法/发现。我正在编写一个脚本,检查定制程序的所有要求。python模块也有很多检查。
有一个小问题
try:
import ..
except:
..
解。在我的情况下,其中一个python模块称为python-nmap
,但是您使用导入了它,import nmap
并且看到名称不匹配。因此,使用上述解决方案进行的测试将返回False结果,并且还会在命中时导入该模块,但对于简单的测试/检查,可能无需使用大量内存。
我也发现
import pip
installed_packages = pip.get_installed_distributions()
installed_packages
将只有pip安装了软件包。在我的系统上,pip freeze
通过40
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
改用(易于使用),但是在这种情况下,模块将不会加载到内存中。
如果您希望脚本安装缺少的软件包并继续,则可以执行以下操作(在“ 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))
一种快速的方法是使用python命令行工具。只需键入,import <your module name>
如果缺少模块,则会看到错误。
$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
>>> import sys
>>> import jocker
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named jocker
$
类myError(exception):通过#或做一些尝试:导入mymodule,除了ImportError,例如e:提高myError(“发生错误”)
我想评论@ ice.nicer的回复,但我不能,所以... 我的观察是带有破折号的软件包都带有下划线,而不仅仅是@dwich注释所指出的点。
例如,您这样做pip3 install sphinx-rtd-theme
,但是:
importlib.util.find_spec(sphinx_rtd_theme)
返回一个对象importlib.util.find_spec(sphinx-rtd-theme)
不返回importlib.util.find_spec(sphinx.rtd.theme)
引发ModuleNotFoundError此外,某些名称已完全更改。例如,您这样做,pip3 install pyyaml
但是将其另存为yaml
我正在使用python3.8