如何使用Python打包现有的C ++项目?

时间:2019-05-05 13:04:22

标签: python package

我正在尝试使同事编写的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 ++代码的主要功能即可运行模型。
  2. 如何在安装程序包时构建C ++代码,并支持Linux / MacOS / Windows(C ++项目没有第三方依赖项),然后如何管理? 运行二进制文件?另外,我如何分发主要OS系列的预编译版本。

我真正不了解的东西

我阅读了许多与distutilssetup.py文件相关的文档页面,搜索了《旅行者指南》(Hitchhiker)的《包装指南》,但找不到完整的指南。特别是,我不了解我的setup.py应该包含什么,我的包应该如何组织以及在调用二进制文件时应该如何处理不同的文件路径……

2 个答案:

答案 0 :(得分:0)

我认为您的做法听起来合理。我将其解决为:

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

有多种方法可以完成上述操作;他们都需要做一些工作,但是最终您将获得一个工作流程。

我个人认为Cython是执行上述所有任务的非常有效的一站式商店。尽管Cython是为高性能python开发的,但仅集成C和C ++模型的流程还是值得使用IMHO。

请查看Cython Tutorial,以快速入门。完整的文档中有许多特定于语言的详细信息,但您不需要这样做。

答案 1 :(得分:0)

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

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

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

我知道这有点hacky,但有一定局限性,但是用Python构建/包装C ++代码仍然令我头疼。如果您能想到更好的解决方案,请立即发布。