假设你想要创建一个混合C++和Python的编程项目.的富 C++项目结构使用的CMake和Python的模块是通过使用创建的痛饮.树结构看起来像这样:
??? CMakeLists.txt ??? FooConfig.cmake.in ??? FooConfigVersion.cmake.in ??? Makefile ??? README ??? foo ? ??? CMakeLists.txt ? ??? config.hpp.in ? ??? foo.cpp ? ??? foo.hpp ??? swig ??? foo.i
现在你想在Python项目中使用Foo项目,比如Bar:
??? AUTHORS.rst ??? CONTRIBUTING.rst ??? HISTORY.rst ??? LICENSE ??? MANIFEST.in ??? Makefile ??? README.rst ??? docs ? ??? Makefile ? ??? authors.rst ? ??? conf.py ? ??? contributing.rst ? ??? history.rst ? ??? index.rst ? ??? installation.rst ? ??? make.bat ? ??? readme.rst ? ??? usage.rst ??? bar ? ??? __init__.py ? ??? bar.py ??? requirements.txt ??? setup.cfg ??? setup.py ??? tests ? ??? __init__.py ? ??? test_bar.py ??? tox.ini
这个结构是通过使用cookiecutter的pypackage模板来创建的.BoilerplatePP模板也可用于使用cookiecutter生成CMake C++项目(无Swig部分).所以现在我有两个项目的结构,并且考虑到开发将主要在Python中进行,项目将在不同的系统中运行,我需要解决以下问题:
混合它们的最佳方法是什么?我应该折叠两个根目录吗?我应该将Foo C++项目作为Bar项目的目录还是相反?我可以是倾斜的,以使整个C++在的根级别的文件夹中上面所示结构的Python项目,但我想知道先验任何缺陷作为CMake的系统是非常强大的,它可以方便地做到这一点的其他方式.
如果我决定将Foo项目作为Bar中的目录,那么Python setuptools包是否与CMake构建系统一样强大?我问这个,因为当我看看该酒吧项目,它似乎只起了一堆脚本的顶层,但我不知道这是不是相当于CMake的,因为我是新来的Python.
上面列出的Bar项目有一个bar目录,但我假设每当这个项目扩展时,而不是在根级别有许多其他目录,其他包含Python代码的目录将放在bar中.这是正确的(在Pythonic意义上)?
我假设将从整个项目中生成一个鸡蛋,以便可以在许多不同的python系统中安装和运行它.Foo项目创建的模块的集成是否容易?我假设这个模块将在与bar不同的目录中创建.
为了在bar目录中使用Python代码,Swig创建的模块必须可用,所以我想最直接的方法是使用CMake系统修改环境变量.这样很好还是有更好的方法?PYTHONPATH
kbuilds.. 7
如果C++应用程序在包含它的Python包之外没有用处:
您可以非常安全地将C++代码放在拥有它的python包中.在示例中的"bar"目录中有"foo"目录.这将使包装最终的Python模块更容易一些.
如果C++应用程序是可重用的:
我肯定会尝试用"包"来思考事物,其中独立部分是独立的.所有独立部分都处于同一级别.如果一个部分依赖于另一个部分,则从相应级别的相应"包"导入.这是依赖关系通常的工作方式.
我不会在另一个中包含一个,因为一个不严格属于另一个.如果您开始第三个需要"foo"但不需要"bar"的项目怎么办?
我会将"foo"和"bar"包放在同一个"project"目录中(我可能会给每个包提供自己的代码存储库,这样每个包都可以轻松维护和安装).
如果C++应用程序在包含它的Python包之外没有用处:
您可以非常安全地将C++代码放在拥有它的python包中.在示例中的"bar"目录中有"foo"目录.这将使包装最终的Python模块更容易一些.
如果C++应用程序是可重用的:
我肯定会尝试用"包"来思考事物,其中独立部分是独立的.所有独立部分都处于同一级别.如果一个部分依赖于另一个部分,则从相应级别的相应"包"导入.这是依赖关系通常的工作方式.
我不会在另一个中包含一个,因为一个不严格属于另一个.如果您开始第三个需要"foo"但不需要"bar"的项目怎么办?
我会将"foo"和"bar"包放在同一个"project"目录中(我可能会给每个包提供自己的代码存储库,这样每个包都可以轻松维护和安装).