繁体   English   中英

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

[英]How to package an existing C++ project using Python?

我正在尝试制作由同事编写的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应该包含什么,我的包应该如何组织以及如何在调用二进制文件时处理不同的文件路径...

我认为你的方法听起来很合理。 我会解决它:

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

有很多方法可以做到这一点; 他们都需要一些工作,但最终你会得到一个工作流程。

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

请查看Cython教程,以便快速入门。 完整文档具有更多特定于语言的详细信息,但不需要用于您的目的。

最后,我决定采用我发现的最简单的方法,作为启动项目的第一步。 我可以考虑稍后改变它。

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

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

我知道这有点hacky和有限,但使用Python构建/包装C ++代码对我来说仍然是一个令人头疼的问题。 如果您能想到更好的解决方案,请随时发布。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM