C,C++与Python的接口

C, C++ Interface with Python

本文关键字:接口 Python C++      更新时间:2023-10-16

我的c ++代码呈指数级增长。我有许多变量(主要是布尔值),每次运行代码时都需要更改(不同的运行条件)。我过去曾使用 main( int argc, char* argv[]) 函数的参数命令行输入完成此操作。

由于这种方法变得很麻烦(我有 18 种不同的运行条件,因此有 18 种不同的参数:-( ),我想转向与 python 接口(如果需要的话是 Bash)。理想情况下,我想编写一个 python 脚本,在其中设置数据成员的值,然后运行代码。

有没有人有任何可以帮助我的指针/信息?更好的是我可以查找的简单编码示例或 URL。

从原始问题编辑:

对不起,我认为我的问题不清楚。我不想在 c++ 中使用 main( int argc, char* argv[]) 功能。而不是在命令行上设置变量。我可以使用 python 在 c++ 代码中声明和初始化数据成员吗?

再次感谢迈克

使用子进程从 python 执行程序。

import subprocess as sp
import shlex
def run(cmdline):
  process = sp.Popen(shlex.split(cmdline), stdout=sp.PIPE, stderr=sp.PIPE)
  output, err = process.communicate()
  retcode = process.poll()
  return retcode, output, err
run('./a.out '+arg1+' '+arg2+' '+...)

C/C++ 和 Python 之间的接口有大量文档,并且有几种不同的方法。但是,如果您只是设置值,那么使用 Python 可能有点过分,它更适合通过将其分配给解释器来自定义流程中的大型操作。

我个人建议研究"ini"文件方法,无论是传统还是使用 XML,甚至是像 Lua 这样更轻的脚本语言。

您可以使用子流程模块启动具有定义的命令行参数的可执行文件:

import subprocess
option1 = True
option2 = Frue
# ...
optionN = True
lstopt = ['path_to_cpp_executable', 
           option1,
           option2,
           ...
           optionN 
         ]
lstopt = [str(item) for item in lstopt] # because we need to pass strings
proc = subprocess.Popen(lstrun, close_fds = True)
stdoutdata, stderrdata = proc.communicate()

如果你使用的是Python 2.7或Python 3.2,那么OrderedDict将使代码更具可读性:

from collections import OrderedDict
opts = OrderedDict([('option1', True),
                    ('option2', False), 
                   ]
lstopt = (['path_to_cpp_executable'] + 
          list(str(item) for item in opts.values())
         )
proc = subprocess.Popen(lstrun, close_fds = True)
stdoutdata, stderrdata = proc.communicate()

使用 ctypes 模块,您可以调用任意 C 库。

几种方法可以将 C 和 C++ 代码与 Python 接口:

  • SWIG
  • Boost.Python
  • 赛通

我只能建议看看swig:使用director功能,它允许完全集成C++和python,包括从onle语言到另一种语言的交叉派生