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

阿尔纳

我正在尝试使同事编写的 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++ 项目没有第三方依赖项),然后我如何设法运行二进制文件或者,我如何为主要操作系统系列分发预编译版本。

我真的不明白什么

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

计时员

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

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

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

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

请查看Cython 教程以快速入门。完整文档包含更多特定于语言的细节,但不是您的目的所必需的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Eclipse打开现有的C ++项目?

来自分类Dev

使用现有的C文件在Eclipse项目中创建

来自分类Dev

如何跟踪现有的ansible项目

来自分类Dev

如何启动现有的 Django 项目?

来自分类Dev

在现有的C项目中使用CUDA Thrust:编译错误

来自分类Dev

如何以编程方式使用IVsSolution.CreateProject重新加载现有的已卸载c#项目

来自分类Dev

如何以编程方式使用IVsSolution.CreateProject重新加载现有的已卸载c#项目

来自分类Dev

随着SBT的发展,如何使用现有的Intellij项目?

来自分类Dev

如何使用VueJS增强现有的Laravel项目?

来自分类Dev

如何使用和运行现有的yeoman项目?

来自分类Dev

将现有的C项目转换为WPF

来自分类Dev

我可以使用现有的C代码创建Visual Studio 2019项目吗?

来自分类Dev

如何修改现有的python文件

来自分类Dev

在现有C项目上使用Go

来自分类Dev

如何为现有的Maven项目创建EAR文件

来自分类Dev

如何对现有的Spring项目迁移到春季启动

来自分类Dev

如何运行现有的AWS放大项目

来自分类Dev

如何为现有的风帆项目设置续集

来自分类Dev

如何为现有的ruby项目创建Java接口

来自分类Dev

如何从现有的 Flask 项目构建 docker 镜像?

来自分类Dev

在现有的Android项目中使用LibGdx库?

来自分类Dev

使用WCF更新现有的asp.net项目

来自分类Dev

如何将新的MVC C#项目与现有的Web窗体VB.NET Web应用程序项目集成?

来自分类Dev

如何在CMake中将现有的QMake项目(.pro项目文件)用作“外部项目”?

来自分类Dev

如何将现有的Android Studio项目连接到现有的Github存储库

来自分类Dev

如何使用Mac OS X在Eclipse中运行现有的Maven项目

来自分类Dev

如何在现有的angularjs项目中使用kendo-ui

来自分类Dev

如何使用EGIT将现有的Eclipse项目推送到Bitbucket?

来自分类Dev

如何使用WSL从Bash构建现有的仅Windows的Visual Studio项目

Related 相关文章

  1. 1

    如何使用Eclipse打开现有的C ++项目?

  2. 2

    使用现有的C文件在Eclipse项目中创建

  3. 3

    如何跟踪现有的ansible项目

  4. 4

    如何启动现有的 Django 项目?

  5. 5

    在现有的C项目中使用CUDA Thrust:编译错误

  6. 6

    如何以编程方式使用IVsSolution.CreateProject重新加载现有的已卸载c#项目

  7. 7

    如何以编程方式使用IVsSolution.CreateProject重新加载现有的已卸载c#项目

  8. 8

    随着SBT的发展,如何使用现有的Intellij项目?

  9. 9

    如何使用VueJS增强现有的Laravel项目?

  10. 10

    如何使用和运行现有的yeoman项目?

  11. 11

    将现有的C项目转换为WPF

  12. 12

    我可以使用现有的C代码创建Visual Studio 2019项目吗?

  13. 13

    如何修改现有的python文件

  14. 14

    在现有C项目上使用Go

  15. 15

    如何为现有的Maven项目创建EAR文件

  16. 16

    如何对现有的Spring项目迁移到春季启动

  17. 17

    如何运行现有的AWS放大项目

  18. 18

    如何为现有的风帆项目设置续集

  19. 19

    如何为现有的ruby项目创建Java接口

  20. 20

    如何从现有的 Flask 项目构建 docker 镜像?

  21. 21

    在现有的Android项目中使用LibGdx库?

  22. 22

    使用WCF更新现有的asp.net项目

  23. 23

    如何将新的MVC C#项目与现有的Web窗体VB.NET Web应用程序项目集成?

  24. 24

    如何在CMake中将现有的QMake项目(.pro项目文件)用作“外部项目”?

  25. 25

    如何将现有的Android Studio项目连接到现有的Github存储库

  26. 26

    如何使用Mac OS X在Eclipse中运行现有的Maven项目

  27. 27

    如何在现有的angularjs项目中使用kendo-ui

  28. 28

    如何使用EGIT将现有的Eclipse项目推送到Bitbucket?

  29. 29

    如何使用WSL从Bash构建现有的仅Windows的Visual Studio项目

热门标签

归档