混合C ++和Python的项目的目录结构

directory structure for a project that mixes C++ and Python

假设你想要创建一个混合C ++和Python的编程项目。 Foo C ++项目结构使用CMake,使用Swig创建Python模块。树结构看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
12
├── 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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
├── 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构建系统一样强大?我问这个问题是因为当我看一下Bar项目时,在顶层似乎只有一堆脚本,但我不知道这是否等同于CMake,因为我是Python的新手。
  • 上面列出的Bar项目有一个bar目录,但我假设每当这个项目扩展时,而不是在根级别有许多其他目录,其他包含Python代码的目录将放在bar中。这是正确的(在Pythonic意义上)?
  • 我假设将从整个项目中生成一个鸡蛋,以便可以在许多不同的python系统中安装和运行它。 Foo项目创建的模块的集成是否容易?我假设这个模块将在与bar不同的目录中创建。
  • 为了在bar目录中使用Python代码,Swig创建的模块必须可用,所以我想最直接的方法是使用CMake系统修改环境变量PYTHONPATH。这样很好还是有更好的方法?

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

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

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

    我肯定会尝试用"包"来思考事物,其中独立部分是独立的。所有独立部分都处于同一级别。如果一个部分依赖于另一个部分,则从相应级别的相应"包"导入。这是依赖关系通常的工作方式。

    我不会在另一个中包含一个,因为一个不严格属于另一个。如果您开始第三个需要"foo"但不需要"bar"的项目怎么办?

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