【问题标题】:directory structure for a project that mixes C++ and Python混合 C++ 和 Python 的项目的目录结构
【发布时间】:2014-10-05 08:38:33
【问题描述】:

假设您想创建一个混合了 C++Python 的编程项目。 Foo C++项目结构使用CMake,使用Swig创建一个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's pypackage template 创建的。 BoilerplatePP 模板也可用于使用 cookiecutter 生成 CMake C++ 项目(没有 Swig 部分)。 所以现在我有了两个项目的结构,并且考虑到开发将主要在 Python 中进行,并且项目将在不同的系统中运行,我需要解决以下问题:

  1. 混合它们的最佳方法是什么?我应该折叠两个根目录吗?我应该将 Foo C++ 项目作为 Bar 项目的目录还是相反?我可能倾向于将上面显示的整个 C++ 结构放在 Python 项目根级别的文件夹中,但我想知道 先验 由于 CMake 系统非常强大,因此可能会遇到任何陷阱,反过来可能会很方便。
  2. 如果我决定将 Foo 项目作为目录放在 Bar 中,Python setuptools 包是否与 CMake 构建系统?我问这个是因为当我查看 Bar 项目时,在顶层似乎只有一堆脚本,但我不知道这是否等同于 CMake 因为我是 Python 的新手。
  3. 上面概述的 Bar 项目只有一个 bar 目录,但我假设每当这个项目扩展时,除了在根级别有许多其他目录,其他目录包含 Python 的代码将被放置在 bar 中。这是正确的吗(在Pythonic 意义上)?
  4. 我假设整个项目会产生一个鸡蛋,这样它就可以在许多不同的python系统中安装和运行。 Foo 项目创建的模块的集成是否容易?我假设这个模块将在与 bar 不同的目录中创建。
  5. 为了bar目录中的Python代码,Swig创建的模块必须可用,所以我猜最多直接的方法是使用 CMake 系统修改环境变量PYTHONPATH。这很好还是有更好的方法?

【问题讨论】:

    标签: python c++ directory swig directory-structure


    【解决方案1】:

    如果 C++ 应用程序在包含它的 Python 包之外没有用处:

    您可以非常安全地将 C++ 代码放在拥有它的 python 包中。在您的示例中的“bar”目录中拥有“foo”目录。这将使打包最终的 Python 模块更容易一些。

    如果 C++ 应用程序可重用:

    我肯定会尝试从“包”的角度来思考问题,其中独立的部分是自包含的。所有独立的部分都生活在同一层次上。如果一个部分依赖于另一个部分,则从同一级别的相应“包”中导入。这就是依赖项通常的工作方式。

    我不会在另一个中包含一个,因为一个并不严格属于另一个。如果您启动了需要“foo”但不需要“bar”的第三个项目怎么办?

    我会将“foo”和“bar”包都放在同一个“项目”目录中(我可能会给每个包提供它自己的代码存储库,以便每个包都可以轻松维护和安装)。

    【讨论】:

    • 实际上 Python 代码将拥有 C++ 项目。后者将被转换为 Python 模块,供 Bar 使用。
    • 知道了。答案已修改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 2014-10-06
    • 1970-01-01
    相关资源
    最近更新 更多