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

dsp*_*pjm 42 c python linux compiler-construction

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

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

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

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

Jac*_*rto 80

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

是的,您可以编写可以作为模块导入Python的C代码.Python称这些扩展模块.您可以直接从Python调用它,这是文档中的一个示例:

Python代码

import example
result = example.do_something()
Run Code Online (Sandbox Code Playgroud)

C代码

static PyObject * example(PyObject *self)
{
    // do something
    return Py_BuildValue("i", result);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果你编写一个*.exe,那么你正在做相反的事情(从C调用Python).您选择的方法(exe与共享库)取决于您是否需要"带有某些Python的C程序""带有某些C的Python程序".

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

Python读取*.py文件并在运行时编译为*.pyc 字节码文件.然后,字节码在Python虚拟机中运行.这意味着"第二次执行相同的文件会更快,因为可以避免从源代码重新编译到字节码." (来自Python词汇表)因此,如果您尚未编辑*.py文件,它将运行*.pyc.您可以在不使用*.py文件的情况下分发*.pyc文件,但它们不会加密并且可以进行反向工程.

  • +1 - 我喜欢真正解释事物的答案(链接很好,但我认为这是一个简洁而有用的概述) (9认同)

Dan*_*per 11

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

查看文档:使用C或C++扩展Python


ffr*_*end 11

你没有必要扩展 Python(这不是简单的,顺便说一句),但可以使用外部函数接口,如ctypes.

  • `ctypes` 比 c-ext 慢得多 (2认同)