Скажем, вы хотите создать программный проект, который смешивает C ++ а также питон. Foo C ++ структура проекта использует CMake, и питон модуль создан с помощью глоток спиртного. Древовидная структура будет выглядеть примерно так:
├── CMakeLists.txt
├── FooConfig.cmake.in
├── FooConfigVersion.cmake.in
├── Makefile
├── README
├── foo
│ ├── CMakeLists.txt
│ ├── config.hpp.in
│ ├── foo.cpp
│ └── foo.hpp
└── swig
└── foo.i
Теперь вы хотели бы использовать Foo проект в рамках питон проект, скажем Бар:
├── 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. Шаблон BoilerplatePP также доступен для создания CMake C ++ проект с использованием cookiecutter (нет глоток спиртного часть).
Итак, теперь у меня есть структура обоих проектов, и, учитывая, что разработка будет происходить в основном в питон и чтобы проект запускался в разных системах, мне нужно ответить на следующие вопросы:
PYTHONPATH
с использованием CMake система. Это нормально или есть лучший способ?Если приложение C ++ не используется вне пакета Python, который будет его содержать:
Вы можете довольно безопасно поместить код C ++ в пакет python, которому он принадлежит. Поместите каталог «foo» в каталог «bar» в вашем примере. Это немного упростит упаковку финального модуля Python.
Если приложение C ++ можно использовать повторно:
Я бы определенно попытался представить вещи в терминах «пакетов», где независимые части являются самодостаточными. Все независимые части живут на одном уровне. Если одна часть зависит от другой, вы импортируете из соответствующей «упаковки» с того же уровня. Вот как обычно работают зависимости.
Я НЕ включил бы одно в другое, потому что одно не принадлежит строго другому. Что если вы начали третий проект, который нуждался в «foo», но не нуждался в «bar»?
Я поместил бы и пакеты «foo», и «bar» в один и тот же каталог «project» (и, вероятно, я бы дал каждому пакету свой собственный репозиторий кода, чтобы каждый пакет можно было легко поддерживать и устанавливать).