使用 distutils 将 C 代码集成到 Python 库中的最常规方法是什么?

What is the most conventional way to integrate C code into a Python library using distutils?

许多著名的 python 库基本上都是用 C 语言编写的(例如 tensorflow 或 numpy),因为这显然可以大大加快速度。通过阅读 this,我能够非常轻松地将 C 函数集成到 python 中。 这样做我终于可以使用 distutils 访问 source.c 文件的功能:

# setup.py

from distutils.core import setup, Extension

def main():
    setup(
        # All the other parameters...
        ext_modules=[ Extension("source", ["source.c"]) ]
        )

if __name__ == "__main__":
    main()

这样当我 运行 python setup.py install 我可以安装我的库。 但是,如果我想为 source.c 中的函数创建一个 python 编码的包装器对象怎么办?有没有办法在不污染已安装模块的情况下做到这一点?
在互联网上闲逛时,我看到了一些使用共享库 (.so) 的看似简单的解决方案。但是我需要一个不涉及附加已编译的 C 代码的解决方案,而是一个在程序第一次编译它的解决方案 运行.

在这种情况下,共享库是正确的方法。 distutils 能够构建静态库如下:

from distutils.ccompiler import new_compiler
from distutils import sysconfig

c = new_compiler()
workdir = "."
c.add_include_dir( sysconfig.get_python_inc() )
c.add_include_dir("./include")
objects = c.compile(["file1.c", "file2.c"])
c.link_shared_lib(objects, "mylibrary", output_dir=workdir)

这将在工作目录中生成 .so 库。

例如它在实际中的使用方式 setup 请参阅 following example