我如何知道Python模块是否存在,而不导入它?

导入一些可能不存在(不是我想要的)的东西会导致:

try:
    import eggs
except ImportError:
    pass

当前回答

你可以写一个小脚本,尝试导入所有的模块,并告诉你哪些是失败的,哪些是工作的:

import pip


if __name__ == '__main__':
    for package in pip.get_installed_distributions():
        pack_string = str(package).split(" ")[0]
        try:
            if __import__(pack_string.lower()):
                print(pack_string + " loaded successfully")
        except Exception as e:
            print(pack_string + " failed with error code: {}".format(e))

输出:

zope.interface loaded successfully
zope.deprecation loaded successfully
yarg loaded successfully
xlrd loaded successfully
WMI loaded successfully
Werkzeug loaded successfully
WebOb loaded successfully
virtualenv loaded successfully
...

警告一句:这将尝试导入所有内容,因此您将看到类似PyYAML失败的错误代码:没有名为PyYAML的模块,因为实际的导入名称只是yaml。只要知道导入,这个就能帮到你。

其他回答

下面是一种检查模块是否从命令行加载的方法:

Linux/UNIX脚本文件方法:制作文件module_help.py:

#!/usr/bin/env python

help('modules')

然后确保它是可执行的:chmod u+x module_help.py

并使用管道调用grep:

./module_help.py | grep module_name

调用内置帮助系统。(此函数用于交互使用。)如果没有给出参数,交互式帮助系统将在解释器控制台上启动。如果参数是字符串,则该字符串将被查询为模块、函数、类、方法、关键字或文档主题的名称,并在控制台上打印帮助页面。如果参数是任何其他类型的对象,则生成该对象的帮助页面。

交互方法:在控制台中,加载python

>>> help('module_name')

如果发现,输入q停止读取。 按Ctrl + D退出Python解释器交互会话

Windows脚本文件方法,也兼容Linux/UNIX,整体上更好:

#!/usr/bin/env python

import sys

help(sys.argv[1])

从命令调用它,像这样:

python module_help.py site

将输出:

模块网站帮助: 的名字 site -将第三方包的模块搜索路径附加到sys.path。 文件 /usr/lib/python2.7/site.py 模块文档 http://docs.python.org/library/site 描述 ... :

你必须按q键才能退出交互模式。

将它用于未知模块,例如,

python module_help.py lkajshdflkahsodf

将输出:

没有找到'lkajshdflkahsodf'的Python文档

并退出。

Ask Ubuntu的一个更简单的if语句,如何检查Python中是否安装了一个模块?:

import sys
print('eggs' in sys.modules)

在使用yarbelk的响应后,我做了这个,所以我不需要导入ìmp。

try:
    __import__('imp').find_module('eggs')
    # Make things with a supposed existing module
except ImportError:
    pass

例如,它在Django的settings.py文件中就很有用。

如果你知道文件的位置,想要检查相应的Python代码文件是否有该模块,你可以简单地通过Python中的astor包进行检查。这里有一个简单的例子:

"""
Check if a module function exists or not without importing a Python package file
"""
import ast
import astor

tree = astor.parse_file('handler.py')
method_to_check = 'handle'
for item in tree.body:
    if isinstance(item, ast.FunctionDef):
        if item.name == method_to_check:
            print('method exists')
            break

使用pkgutil中的一个函数,例如:

from pkgutil import iter_modules

def module_exists(module_name):
    return module_name in (name for loader, name, ispkg in iter_modules())