In Python how can one tell if a module comes from a C extension?

后端 未结 4 974
清酒与你
清酒与你 2020-12-15 09:12

What is the correct or most robust way to tell from Python if an imported module comes from a C extension as opposed to a pure Python module? This is useful, for example, i

4条回答
  •  悲&欢浪女
    2020-12-15 09:56

    While Cecil Curry's answer works (and was very informative, as was abarnert's, I might add) it will return False for the "top level" of a module even if it includes sub-modules that use the C extension (e.g. numpy vs. numpy.core.multiarray).

    While probably not as robust as it could be, the following is working for my use current use cases:

    def is_c(module):
    
        # if module is part of the main python library (e.g. os), it won't have a path
        try:
            for path, subdirs, files in os.walk(module.__path__[0]):
    
                for f in files:
                    ftype = f.split('.')[-1]
                    if ftype == 'so':
                        is_c = True
                        break
            return is_c
    
        except AttributeError:
    
            path = inspect.getfile(module)
            suffix = path.split('.')[-1]
    
            if suffix != 'so':
    
                return False
    
            elif suffix == 'so':
    
                return True
    
    is_c(os), is_c(im), is_c(et), is_c_extension(ma), is_c(numpy)
    # (False, False, True, True, True)
    

提交回复
热议问题