假设您想创建一个混合使用 C++ 和 Python 的编程项目。 Foo C++ 项目结构使用 CMake,Python 模块使用 Swig创建em>。树结构看起来像这样:
├── 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(无 Swig 部分)生成 CMake C++ 项目。 所以现在我已经有了两个项目的结构,并且考虑到开发将主要在 Python 中进行并且项目将在不同的系统中运行,我需要解决以下问题: p>
- 混合它们的最佳方式是什么?我应该折叠两个根目录吗?我应该将 Foo C++ 项目作为 Bar 项目的目录还是相反?我可能倾向于将上面显示的整个 C++ 结构放在 Python 项目的根级别的文件夹中,但我想知道先验 任何陷阱,因为 CMake 系统非常强大,反过来可能会很方便。
- 如果我决定将 Foo 项目作为目录放在 Bar 中,Python setuptools 包是否与 CMake 构建系统?我问这个是因为当我查看 Bar 项目时,在顶层似乎只有一堆脚本,但我不知道这是否等同于 CMake 因为我是 Python 的新手。
- 上面概述的 Bar 项目有一个 bar 目录,但我假设每当这个项目扩展时,其他目录不会在根级别有许多其他目录包含 Python 的代码将被放置在 bar 中。这是否正确(在 Pythonic 意义上)?
- 我假设整个项目会生成一个 egg,这样它就可以在许多不同的 python 系统中安装和运行。 Foo 项目创建的模块的集成容易吗?我假设此模块将在与 bar 不同的目录中创建。
- 为了 bar 目录中的 Python 代码,Swig 创建的模块必须可用,所以我猜最执行此操作的直接方法是使用 CMake 系统修改环境变量
PYTHONPATH
。这样好还是有更好的方法?
最佳答案
如果 C++ 应用程序在将包含它的 Python 包之外没有用处:
您可以非常安全地将 C++ 代码放在拥有它的 python 包中。在您的示例中的“bar”目录中有“foo”目录。这将使打包最终的 Python 模块更容易一些。
如果 C++ 应用程序是可重用的:
我肯定会尝试从“包”的角度来思考事物,其中独立的部分是自包含的。所有独立的部分都在同一层。如果一个部分依赖于另一个部分,则从同一级别从其相应的“包”中导入。这就是依赖项通常的工作方式。
我不会将一个包含在另一个中,因为一个不严格属于另一个。如果您启动了第三个需要“foo”但不需要“bar”的项目怎么办?
我会把“foo”和“bar”包放在同一个“项目”目录中(我可能会给每个包它自己的代码库,这样每个包都可以很容易地维护和安装)。
关于python - 混合 C++ 和 Python 的项目的目录结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25261550/