【问题标题】:How to package an existing C++ project using Python?如何使用 Python 打包现有的 C++ 项目?
【发布时间】:2019-09-23 07:47:07
【问题描述】:

我正在尝试使同事编写的 C++ 研究代码易于新研究生使用。 我想做的是一个用干净的编程接口抽象出项目的底层结构的包。这对于我的同事来说应该简单来帮助维护它,而无需成为世界级的 Python 专家。

我需要您的帮助来设计和组织我的包裹。

现有代码

现有代码进行物理模拟。它需要一个纯文本输入文件,其中包含用于启动模型的值。然后,在 C++ 中进行一些数字运算,并将模拟结果写入另一个文本文件。

这种方法的问题在于它缺乏灵活性,尤其是在循环使用不同的参数值时,而且它的设置和使用不是超级用户友好的。使用 bash 脚本会鼓励不良做法和较差的可重复性。

目标

我们想要的是一个包:

  • 附带 C++ 模型,并且能够从 Python 运行它。
  • 能够进行模板填充以创建输入文件并解析输出文件。 [为此我不需要帮助]
  • (可选)构建 C++ 以允许扩展模型。否则只包含预编译的二进制文件。

用户最后会有这样的东西:

import mymodel

# The variables I'll use
myparams = {temperature : 100, foo : 1, bar : "hello", ...}

# create a Python object for example
mysim = mymodel.simulation(myparams) 

# run the C++ model
result = mysim.run() 

问题

我仍然无法弄清楚的是:

  1. 就我而言,这是一个合理的策略吗,或者我应该考虑另一种策略,例如。 Python/C++ 直接接口?似乎很难,我只需要调用 C++ 代码的 main 函数来运行模型。
  2. 在安装包时如何构建C++代码,支持Linux/MacOS/Windows(C++项目没有第三方依赖),然后我该如何管理运行二进制文件 ?或者,我如何分发主要操作系统系列的预编译版本。

我真的不明白

我阅读了许多与 distutilssetup.py 文件相关的文档页面,搜索了 The Hitchhiker's Guide to Packaging,但我找不到关于我正在尝试做什么的全面指南。特别是,我不明白我的setup.py 应该包含什么,我的包应该如何组织以及在调用二进制文件时我应该如何处理不同的文件路径......

【问题讨论】:

    标签: python package


    【解决方案1】:

    我认为您的方法听起来很合理。我会这样处理:

    1. 在 Python 中围绕 C++ 模型创建一个包装器。
    2. 编译模型并导入包装器以确保一切正常。
    3. 创建一个包含已编译 C++ 的包装器的 python 库 “.o”。
    4. 测试包装器以供独立使用,然后分发。

    上面有很多方法;他们都需要一些工作,但最终你会得到一个工作流程。

    就个人而言,我发现 Cython 是一个非常有效的一站式商店,可以完成上述所有工作。尽管 Cython 是为高性能 python 开发的,但它单独集成 C 和 C++ 模型的流程值得使用恕我直言。

    请查看Cython Tutorial 以快速入门。完整文档包含更多特定于语言的详细信息,但您不需要。

    【讨论】:

      【解决方案2】:

      最后,我决定采用我认为最简单的方法,作为启动项目的第一步。以后可能会考虑改一下。

      我将预编译的二进制文件添加到“bin”文件夹中,并使用我的 setup.py 文件中的package_data={'mypkg': ['bin']} 选项来解决路径问题,如here 所述。可执行文件foo 必须位于此处:mypkg/bin/foo。 这样,我可以在我的包中运行foo,例如:

      subprocess.getoutput(pkg_resources.resource_filename('mypkg', 'bin')+"/foo")
      

      我知道这有点笨拙和有限,但是用 Python 构建/包装 C++ 代码仍然让我头疼。如果您能想到更好的解决方案,请不要犹豫发布。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 1970-01-01
        • 1970-01-01
        • 2021-11-03
        • 1970-01-01
        • 1970-01-01
        • 2013-09-03
        相关资源
        最近更新 更多