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

时间:2013-09-12 11:10:15

标签: python c linux compiler-construction

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

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

如果我希望C代码是一个库,这意味着我将它与#include一起使用并且可能在Python中链接*.o,该怎么做?那可能吗?如果我将C代码写入可执行文件,这意味着它成为一个命令,我可以直接在Python中调用它吗?

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

3 个答案:

答案 0 :(得分:73)

  

我想在python中调用那些C函数或可执行文件。这可能。

是的,您可以编写可以作为模块导入Python的C代码。 Python称这些扩展模块。您可以直接从Python调用它,例如documentation

Python代码

import example
result = example.do_something()

C代码

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

如果我希望C代码是一个库,这意味着我将它与#include一起使用并且可能在python中使用* .o的链接,如何做或者可能。

您将其构建为共享库 *。dll *。所以 您还可以调查使用distutils来分发您的模块。

  

如果我将C代码写入可执行文件,这意味着它成为一个命令,我可以直接在python中调用它吗?

如果你写了 * .exe ,那么你正在做相反的事情(调用Python from C)。您选择的方法(exe与共享库)取决于您是否需要“C program with some Python”“Python program with some C”

  

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

Python会读取 *。py 文件,并在运行时编译为 * .pyc 字节码文件。然后,字节码在Python虚拟机中运行。这意味着“第二次执行相同的文件会更快,因为可以避免从源代码重新编译到字节码。”(来自Python术语表)所以如果你还没有编辑 *。py 文件,它将运行 * .pyc 。您可以在不使用 *。py 文件的情况下分发 * .pyc 文件,但这些文件不会加密并且可以进行逆向工程。

答案 1 :(得分:10)

您无需扩展 Python(这不是一件容易的事,顺便说一下),但可以使用外部功能界面,例如 ctypes

答案 2 :(得分:9)

是的,可以使用C / C ++扩展Python。

查看文档:{​​{3}}