Как упаковать существующий проект C ++, используя Python? - PullRequest
0 голосов
/ 05 мая 2019

Я пытаюсь сделать исследовательский код C ++, написанный коллегами, удобным для использования новыми аспирантами. То, что я хотел бы сделать, - это пакет, который абстрагирует основную структуру проекта с чистым интерфейсом программирования . Этого должно быть просто , чтобы мои коллеги могли поддерживать его, не будучи экспертами мирового уровня Python.

Мне нужна ваша помощь для разработки и организации моей посылки.

Существующий код

Существующий код выполняет физическое моделирование. Требуется простой текстовый входной файл, содержащий значения для инициации модели. Затем в C ++ выполняется некоторое сокращение чисел, и оно записывает результаты моделирования в другой текстовый файл.

Проблема с этим подходом заключается в том, что ему не хватает гибкости, особенно при зацикливании на различных значениях параметров, и он не очень удобен в настройке и использовании. Использование сценариев bash поощряет плохие практики и плохую воспроизводимость.

Цель

Нам нужен пакет, который:

  • поставляется с моделью C ++ и может запускать ее из Python.
  • может заполнять шаблон для создания входного файла и для анализа выходного файла. [для этого мне не нужна помощь]
  • (необязательно), сборка C ++, позволяющая расширить модель. В противном случае просто включите предварительно скомпилированные двоичные файлы.

У пользователя будет что-то вроде этого в конце:

import mymodel

# The variables I'll use
myparams = {temperature : 100, foo : 1, bar : "hello", ...}

# create a Python object for example
mysim = mymodel.simulation(myparams) 

# run the C++ model
result = mysim.run() 

Вопросы

То, что я до сих пор не могу понять, это:

  1. В моем случае, - это разумная стратегия для этого , или я должен рассмотреть другую, например. Прямой интерфейс Python / C ++? Кажется трудным, и мне нужно только вызвать основную функцию кода C ++, чтобы запустить модель.
  2. Как собрать код C ++ при установке пакета, с поддержкой Linux / MacOS / Windows (проект C ++ не имеет сторонних зависимостей), и как мне тогда запустить двоичный файл ? Или как распространять предварительно скомпилированные версии для основных семейств ОС.

Что я действительно не понимаю

Я прочитал несколько страниц документации, относящихся к файлам distutils, setup.py, искал Руководство по упаковке автостопом, но не смог найти исчерпывающее руководство по тому, что я пытаюсь сделать. Особенно я не понимаю, что должен содержать мой setup.py, как должен быть организован мой пакет и как я должен обрабатывать пути к различным файлам при вызове двоичного файла ...

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Наконец, я решил пойти на то, что я считаю самым простым подходом, в качестве первого шага для инициирования проекта.Я мог бы рассмотреть возможность его изменения позже.

Я добавил предварительно скомпилированные двоичные файлы в папку «bin» и использовал опцию package_data={'mypkg': ['bin']} в моем файле setup.py для решения проблемы пути, как объяснено здесь .Исполняемый файл foo должен находиться здесь: mypkg/bin/foo.Таким образом, я могу запустить foo из своего пакета с чем-то вроде:

subprocess.getoutput(pkg_resources.resource_filename('mypkg', 'bin')+"/foo")

Я знаю, что это несколько хакерски и ограниченно, но сборка / обертывание кода C ++ с Python все еще является головной болью длямне.Если вы можете придумать лучшее решение, пожалуйста, не стесняйтесь его опубликовать.

0 голосов
/ 05 мая 2019

Я думаю, что ваш подход звучит разумно. Я бы решил это как:

  1. Создание оболочки вокруг модели C ++ в Python.
  2. Скомпилируйте модель и импортируйте оболочку, чтобы убедиться, что все работает.
  3. Создать библиотеку Python для оболочки, включая скомпилированный C ++ ".O".
  4. Проверьте упаковку для автономного использования, а затем распространите.

Есть много способов сделать выше; все они потребуют некоторой работы, но в конечном итоге вы получите рабочий процесс.

Лично я нашел Cython очень эффективным универсальным магазином для всего вышеперечисленного. Хотя Cython был разработан для высокопроизводительного Python, его метод интеграции только моделей C и C ++ стоит использовать IMHO.

Пожалуйста, ознакомьтесь с Cython Tutorial для быстрого начала работы. Полная документация содержит гораздо больше подробностей, связанных с языком, но не нужна для ваших целей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...