怎么判断一个python 包是否 C extensions are involved?

问题1:
python 项目引用了一些包,怎么区别那些是纯python的包,那些是使用了 c 扩展,
有什么工具吗

问题2:
像 pynput,pyautogui,调用系统 api ,也算是使用了 c 扩展吗?

阅读 1.6k
3 个回答

去看一下源码就知道了,里面是否有C代码。另外还要看其是否有依赖包,以及依赖包是否有C代码。依次递推下去。

调用系统API的肯定不能算使用了C扩展呀。


本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。

问题一:下源码,看代码

比如 numpy,下面有很多 c 代码

图片.png

图片.png

问题二:不算

想知道什么算,就去谷歌『为 python 编写 c 扩展』,自己走一遍就知道了

关于第一个问题已经有人在 Stackoverflow 提问过了,可以看看这个链接

也有人写了一个根据路径来检验是否是 C 代码,如果模块是 Python 主库的一部分(比如 os ),它就没有路径,可以简单参考一下:

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)

第二个问题,如果是调用了系统 api,应该也不能简单作为判断,任何高级语言都需要调用底层操作系统的接口吧。

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题