如何确定模块名称是否为python标准库的一部分

Yoh*_* De 7 python python-2.7

我有一个模块名称作为字符串(例如“ logging”),该名称是通过查询对象的模块属性给出的。

如何区分属于项目的模块和属于python标准库的模块?

我知道我可以使用pip.get_installed_distributions()检查该模块是否由pip安装,但是这些与标准库无关

注意:我正在使用python 2.7,因此仅在python 3.x中有效的解决方案不太重要。

这里的答案不同,我一直在寻找一种可以在O(1)中运行并且不需要保存结果数组,也不必扫描每个查询的目录的解决方案。

谢谢。

Alp*_*ren 5

编辑:

我使用了这个解决方案(来源)。

import distutils.sysconfig as sysconfig
import os

def std_modules():
    ret_list = []
    std_lib = sysconfig.get_python_lib(standard_lib=True)
    for top, dirs, files in os.walk(std_lib):
        for nm in files:
            if nm != '__init__.py' and nm[-3:] == '.py':
                ret_list.append(os.path.join(top, nm)[len(std_lib)+1:-3].replace('\\','.'))
    return ret_list
            
l = std_modules()
print("logging" in l)
print("os" in l)
Run Code Online (Sandbox Code Playgroud)

输出:

False
True
Run Code Online (Sandbox Code Playgroud)

这适用于 Python 2 和 Python 3。

编辑前:

我想,你可以使用Python Docs。以下是Python 2 DocsPython 3 Docs的标准库部分。此外,您还可以选择准确的 Python 版本。


Gui*_*ume 4

快速而肮脏的解决方案,使用标准模块imp

import imp
import os.path
import sys

python_path = os.path.dirname(sys.executable)

my_mod_name = 'logging'

module_path = imp.find_module(my_mod_name)[1]
if 'site-packages' in module_path or python_path in module_path or not imp.is_builtin(my_mod_name):
    print('module', my_mod_name, 'is not included in standard python library')
Run Code Online (Sandbox Code Playgroud)