使用 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
许多著名的 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