【问题标题】:Is it possible to compile c code using python?是否可以使用python编译c代码?
【发布时间】:2012-03-14 07:24:00
【问题描述】:

我想构建一个 python 程序,将 .c 文件的路径作为输入,然后编译它。

如果编译成功,程序会在屏幕上输出OK,否则会输出BAD。

我一直在尝试用谷歌搜索它,但找不到任何东西。我也一直在尝试使用编译程序的参数在 python 中运行 cmd,但没有成功。

澄清一下——我的机器中已经有了一个非常具体的编译器,我想运行它。我不希望 python 充当编译器。只需获取一个代码,在上面运行我的编译器,然后看看答案是什么。

  • 它应该可以在带有 python 2.4 的 Linux 服务器上运行。

谢谢

【问题讨论】:

  • 你可能会在 distutils 中查看,但所做的只是为 gcc 或类似的编译器提供一个 python 层,最终 python 将不会进行编译并且会有依赖项。
  • 有一个很好的 Pycon 演讲 Using Python to debug C and C++ code (using gdb) 可能对你有帮助。
  • 如果你想运行一个编译器,你只是用 Python 运行一个子进程。在这种情况下,这个问题是所有其他寻求在 Python 下运行子进程的问题的完全重复。关闭它。以下是所有相关问题,它们都提供了大致相同的答案。 stackoverflow.com/search?q=python+subprocess。他们都回答了“澄清”的问题。
  • subprocess with timeout的可能重复

标签: python c compiler-construction compilation compiler-errors


【解决方案1】:

您可以仅使用标准库来编译 C 代码,它可以在每个平台和每个 Python 版本上运行(假设您实际上有一个可用的 C 编译器)。查看 Python 用来编译 C 扩展模块的 distutils.ccompiler 模块。一个简单的例子:

// main.c

#include <stdio.h>

int main() {
    printf("Hello world!\n");
    return(0);
}

编译脚本:

# build.py
from distutils.ccompiler import new_compiler

if __name__ == '__main__':
    compiler = new_compiler()
    compiler.compile(['main.c'])
    compiler.link_executable(['main.o'], 'main')

其他所有内容(包括路径、库路径、自定义标志或链接参数或宏)都可以通过各种配置选项进行传递。查看上面的模块文档链接了解更多信息。

【讨论】:

    【解决方案2】:

    如果我对你的理解很清楚,你只是想用 python 的一些参数运行编译器?

    在这种情况下,您可以只使用 os.system。 http://docs.python.org/library/os.html#os.system

    或者更好的方法是模块“子进程”。 http://docs.python.org/library/subprocess.html#module-subprocess

    【讨论】:

      【解决方案3】:

      第 1 步。获得 PLY。 Python Lex 和 Yacc。 http://www.dabeaz.com/ply/

      第 2 步。为 C.http://www.lysator.liu.se/c/ANSI-C-grammar-y.html 查找 Yacc/Lex 配置

      第 3 步。调整 PLY 以使用您找到的 C 语言规则。

      第 4 步。运行。您正在“编译”C 代码——检查语法。

      【讨论】:

        【解决方案4】:

        当然,为什么不呢?当然,您需要安装 GCC(或 llvm),这样您就可以进行编译。您可以只使用 os.system 或任何其他方式调用外部程序。

        当然,您最好查看 SCons 之类的内容,它已经存在可以解决此问题。

        另外,要回答实际提出的问题,没有什么可以阻止您在 python 中编写编译器/汇编器/链接器,它们只是像其他任何东西一样的程序。不过性能可能不会很好。

        【讨论】:

        • Scons 对此有何帮助。能详细点吗?
        猜你喜欢
        • 1970-01-01
        • 2022-09-28
        • 1970-01-01
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        • 2012-02-15
        • 2011-06-14
        • 1970-01-01
        相关资源
        最近更新 更多