在Python脚本中检查包是否已安装的好方法是什么?我知道这在解释器中很简单,但我需要在脚本中完成。
我想我可以检查系统上是否有在安装过程中创建的目录,但我觉得有更好的方法。我正在尝试确保安装了Skype4Py包,如果没有,我将安装它。
我对完成检查的想法
发布于 2009-06-26 21:00:18
如果您指的是python脚本,只需执行以下操作:
Python 3.3+使用sys.modules和find_spec
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:
try:
import mymodule
except ImportError as e:
pass # module doesn't exist, deal with it.
Python 2:
try:
import mymodule
except ImportError, e:
pass # module doesn't exist, deal with it.
发布于 2014-12-16 09:29:25
更新的答案
一种更好的方法是:
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命名空间导入并不能让您全面了解系统上安装的内容。
请注意,建议的解决方案是可行的:
当使用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
.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
发布于 2017-01-24 05:23:05
从Python3.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")
https://stackoverflow.com/questions/1051254
复制相似问题