Python:如何检查导入的模块/包/类是否来自标准库

Python:如何检查导入的模块/包/类是否来自标准库,python,Python,是否有可能验证导入是否来自标准库 例如: from math import sin #from the standard library. from my_module import MyClass #not from the standard library. 没有简单的方法可以做到这一点,因为Python标准库不是以一种特殊的方式实现的——对于Python来说,标准库和其他模块之间没有区别 充其量,您可以使用来尝试查找一些指示符,例如,使用来查找源文件所在的位置,然后使用它来检查它是否是核

是否有可能验证导入是否来自标准库

例如:

from math import sin #from the standard library.
from my_module import MyClass #not from the standard library.

没有简单的方法可以做到这一点,因为Python标准库不是以一种特殊的方式实现的——对于Python来说,标准库和其他模块之间没有区别

充其量,您可以使用来尝试查找一些指示符,例如,使用来查找源文件所在的位置,然后使用它来检查它是否是核心库。但是,这不会特别有效,因为C中的任何模块都会返回一个TypeError,因为它们是内置的-但是您不能假定它们来自标准库,因为任何C扩展模块都会做同样的事情


如果你真的必须这样做,我的建议是保留一个标准库模块名称列表,并这样做-这不是一个很好的解决方案,但它可能比任何替代方案都更稳定。

没有简单的方法可以做到这一点,因为Python标准库不是以特殊的方式实现的-对于Python,标准库和其他模块之间没有区别

充其量,您可以使用来尝试查找一些指示符,例如,使用来查找源文件所在的位置,然后使用它来检查它是否是核心库。但是,这不会特别有效,因为C中的任何模块都会返回一个TypeError,因为它们是内置的-但是您不能假定它们来自标准库,因为任何C扩展模块都会做同样的事情


如果您确实必须这样做,我的建议是保留一个标准库模块名称列表,并以这种方式执行-这不是一个很好的解决方案,但它可能比任何替代方案都更稳定。

如果您将自己的模块保存在特定目录中,您可以查看模块的
\uuuuu文件\uuuuu
属性:

>>> import os
>>> os.__file__
'/usr/lib64/python2.6/os.pyc'

>>> import my_module
>>> my_module.__file__
'/path/to/my_packages/.../my_module.pyc'

如果您将自己的模块保存在特定目录中,则可以查看模块的
\uuu文件\uuu
属性:

>>> import os
>>> os.__file__
'/usr/lib64/python2.6/os.pyc'

>>> import my_module
>>> my_module.__file__
'/path/to/my_packages/.../my_module.pyc'

下面的源代码将告诉您模块是否为标准Python模块

def is_standard_module(module_name):
    if module_name in sys.builtin_module_names:
        return True
    installation_path = None
    try:
        installation_path = importlib.import_module(module_name).__file__
    except ImportError:
        return False
    linux_os, _, _ = platform.linux_distribution()
    return "dist-packages" not in installation_path if linux_os == "Ubuntu" else "site-packages" not in installation_path

下面的源代码将告诉您模块是否为标准Python模块

def is_standard_module(module_name):
    if module_name in sys.builtin_module_names:
        return True
    installation_path = None
    try:
        installation_path = importlib.import_module(module_name).__file__
    except ImportError:
        return False
    linux_os, _, _ = platform.linux_distribution()
    return "dist-packages" not in installation_path if linux_os == "Ubuntu" else "site-packages" not in installation_path

太糟糕了,Python没有像Java使用标准库那样将其所有标准库包/模块放在Python包中。这使得断言一个包/模块是否属于标准库的任务变得微不足道。@AlanEvangelista这真的是你需要经常了解的事情吗?在我看来,不必键入
python.
for everything的用例远远超过了它。太糟糕了,python没有像Java使用标准库那样将所有标准库包/模块放在python包中。这使得断言一个包/模块是否属于标准库的任务变得微不足道。@AlanEvangelista这真的是你需要经常了解的事情吗?在我看来,不必为每件事键入
python.
的用例比它重要了一英里。