我们能在Python中使用C代码吗?

72

我知道Python提供了一个API,使得你可以在C代码中调用Python解释器,但是我想要的恰恰相反。

我的程序需要使用一些C API,所以必须用C语言编写代码。但我还想将程序与Python打包在一起。这意味着我想在Python中调用那些C函数或可执行文件。是否有可能?

如果我想让C代码成为一个库,也就是说我在Python中使用它,通过使用#include和链接*.o的方式,该怎么办? 这有可能吗? 如果我将C代码编写成可执行文件,也就是说它变成一个命令,我可以直接在Python中调用它吗?

另外,我听说Python代码可以被编译,这是否意味着我们可以在没有源文件的情况下执行代码?输出文件是二进制文件吗?这会提高性能吗?


6
Python文档中有一个完整的章节介绍这个主题:http://docs.python.org/3.3/extending/index.html - Carsten
具体地说:http://docs.python.org/3.3/extending/embedding.html#embedding-python-in-c - T.J. Crowder
有趣的是,一些问题被认为是不相关的,但它们的重复却不是:https://dev59.com/DHVC5IYBdhLWcg3w7Vxq :-) - Ciro Santilli OurBigBook.com
2个回答

120

我想在Python中调用一些C函数或可执行文件,这个可以实现吗?

是的,可以编写C代码作为模块导入到Python中。Python称其为扩展模块。您可以直接从Python中调用它,以下是一个来自文档的例子:

Python 代码

import example
result = example.do_something()

C 代码

static PyObject * example(PyObject *self)
{
    // do something
    return Py_BuildValue("i", result);
}

如果我想将C代码作为库使用,也就是我在Python中使用#include和*.o文件链接,怎么做或者是否可以实现。
你需要将其构建为共享库*.dll或*.so。你也可以研究使用distutils来分发你的模块。
如果我将C代码写成可执行文件,也就是变成一个命令,我能直接在Python中调用它吗?
如果你编写了*.exe,则是相反的操作(调用Python from C)。你选择的方法(exe vs shared library)取决于你是想要一个“带有一些Python的C程序”还是一个“带有一些C的Python程序”。
另外,我听说Python代码可以被编译,这是否意味着我们可以在没有源文件的情况下执行代码?输出文件是二进制文件吗?这会提高性能吗?
Python会读取*.py文件并在运行时编译为*.pyc字节码文件。然后,该字节码将在Python虚拟机中运行。这意味着“执行相同的文件第二次更快,因为可以避免从源代码重新编译为字节码”(来自Python词汇表)。因此,如果您没有编辑过*.py文件,则会运行*.pyc文件。您可以分发*.pyc文件而无需*.py文件,但是它们不是加密的,可以被反向工程。

22
+1 - 我喜欢那些真正解释事情的答案(链接也很好,但我认为这是一个简洁而有用的概述) - mdscruggs

15

您并不一定需要 扩展 Python(这并不容易),但可以使用外部函数接口,例如 ctypes


2
ctypes 比 c-ext 慢得多。 - TomSawyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接