我有一个模块名称作为字符串(例如“ logging”),该名称是通过查询对象的模块属性给出的。
如何区分属于项目的模块和属于python标准库的模块?
我知道我可以使用pip.get_installed_distributions()检查该模块是否由pip安装,但是这些与标准库无关
注意:我正在使用python 2.7,因此仅在python 3.x中有效的解决方案不太重要。
与这里的答案不同,我一直在寻找一种可以在O(1)中运行并且不需要保存结果数组,也不必扫描每个查询的目录的解决方案。
谢谢。
编辑:
我使用了这个解决方案(来源)。
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 Docs和Python 3 Docs的标准库部分。此外,您还可以选择准确的 Python 版本。
快速而肮脏的解决方案,使用标准模块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)