我正在尝试使同事编写的C ++研究代码容易被新研究生使用。 我想做的是一个使用干净的编程界面抽象项目的基础结构的程序包。这应该简单,足以让我的同事帮助维护它,而不必成为Python的世界级专家。
需要我的帮助来设计和整理我的包裹。
现有代码进行物理模拟。它采用纯文本输入文件,其中包含用于启动模型的值。然后,在C ++中执行一些数字运算,并将模拟结果写入另一个文本文件。
这种方法的问题是它缺乏灵活性,尤其是在循环使用不同的参数值时,并且设置和使用起来都不是超级用户友好。使用bash脚本会鼓励不良做法和可重复性差。
我们想要的是一个软件包:
用户最后会有这样的内容:
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()
我仍然不知道的是:
我真正不了解的东西
我阅读了许多与distutils
,setup.py
文件相关的文档页面,搜索了《旅行者指南》(Hitchhiker)的《包装指南》,但找不到完整的指南。特别是,我不了解我的setup.py
应该包含什么,我的包应该如何组织以及在调用二进制文件时应该如何处理不同的文件路径……
答案 0 :(得分:0)
我认为您的做法听起来合理。我将其解决为:
有多种方法可以完成上述操作;他们都需要做一些工作,但是最终您将获得一个工作流程。
我个人认为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 ++代码仍然令我头疼。如果您能想到更好的解决方案,请立即发布。