使用在 windows shell 下运行的 Python 解释器编译 C++ 代码

Posted

技术标签:

【中文标题】使用在 windows shell 下运行的 Python 解释器编译 C++ 代码【英文标题】:Compiling C++ code using Python interpreter running under windows shell 【发布时间】:2014-07-09 09:40:29 【问题描述】:

我的环境是:

Windows 7。 PyDev IDE(日食)。 Python 2.7。

我想编译和测试我用 C++ 编写的一些代码(将来,这些代码将由 Python 脚本生成)。我需要编译一个简单的 .c 文件以用作 python 扩展。

现在我的代码是:

/*
file: test.c 
This is a test file for add operations.
 */
float my_add(float a, float b)

    float res;
    res = a + b;
    return res;

还有.py文件:

import subprocess as sp
import os
class PyCompiler():
    def __init__(self, name):
        self.file = name
        self.init_command = r"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat"
        self.compiler_command = r"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\cl.exe"
        sp.call(self.init_command + " " + self.file)

    def compile(self):
        alfa = sp.call(self.compiler_command)
        print(alfa)

TestCode = PyCompiler(r"C:\Python27\CodeGenerator\src\nested\test.c")
TestCode.compile()

如果我启动这个脚本,我会得到:

这意味着我在 PyCompiler.compile 方法中遇到了错误,因为 subprocess.call 的返回不是 1。

您能否就这个问题提供一些指导?

你知道其他方法吗?

【问题讨论】:

看起来您的 Visual C 安装可能已损坏。从普通命令行运行 vcvars32.bat 会发生什么? 它的工作原理完全相同,“使用 Microsoft Visual Studio 2008 x86 工具的设置环境”行。看起来就像在 PyDev 执行中一样。我认为问题出在第二行(“TestCode.compile()”),即调用“cl.exe”的那一行,我无法执行。 打开命令行。运行vcvars32.bat。运行vcvars32.bat 后,在同一命令窗口中键入cl.exe。如果这可行,那么您必须调整您的 Python 代码以执行相同的操作。也就是说,您必须在同一命令环境中运行 vcvars32.bat 和 cl.exe,而不是在不同的环境中。不要问我如何调整你的 Python 代码(对 Python 的了解不足以帮助你)。 其实这似乎是实现这一目标的关键问题。谢谢! 【参考方案1】:

我实际上通过安装 MinGW 并使用它来编译我的 C 代码来解决这个问题。我的python代码是:

import subprocess as sp
import os
import importlib

my_env = os.environ

类初始化:

class PyCompiler():
        def __init__(self, name_in, module, dep_list):
            self.file = name_in
            self.dep = dep_list
            self.module_name = module
            self.compiler_command = r"python setup.py  build_ext --inplace -c mingw32 "
            ''' Here it goes the creation of the setup.py file: '''
            self.set_setup()

还有类方法:

def compile(self):
    command = self.compiler_command
    self.console = sp.call(command, env=my_env)

def include(self):
    module = __import__(self.module_name)
    return module

def set_setup(self):
    dependencies = ""
    for elem in self.dep:
        dependencies = dependencies + ",'"+elem+".c'"
    filename = "setup.py"
    target = open (filename, 'w')
    line1 = "from distutils.core import setup, Extension"
    line2 = "\n"
    line3 = "module1 = Extension('"
    line4 = self.module_name
    line5 = "', sources = ['"+self.file+"'"+dependencies+"])\n"
    line6 = "setup (name = 'PackageName',"   
    line7 = "version = '1.0',"
    line8 = "description = 'This is the code generated package.',"
    line9 = "ext_modules = [module1])"
    target.write(line1 + line2 + line3 + line4 + line5 + line6 + line7 + line8 + line9)
    target.close()

以及执行代码:

TestCode = PyCompiler(file, module, [lib])
TestCode.compile()
test = TestCode.include()
file 是要编译的 C 文件。 module 是分配给创建的 python 模块的名称。 [lib] 是附加 C 依赖项的列表。

【讨论】:

以上是关于使用在 windows shell 下运行的 Python 解释器编译 C++ 代码的主要内容,如果未能解决你的问题,请参考以下文章

Python脚本在Windows下后台运行

如何在windows下使用linux的shell脚本

windows怎么运行shell脚本

如何在windows下使用linux的shell脚本

使用在 windows shell 下运行的 Python 解释器编译 C++ 代码

如何在windows下写shell脚本