Как разделить библиотеку между процессом и вызываемым скриптом, используя SWIG?

0

У меня есть программа C++ foobar которая начинается с main() а затем поток управления проходит через первую часть, затем вторую часть программы. Если я изменю main на foobar_main, я могу скомпилировать всю программу и оболочку SWIG Python в общую библиотеку foobar.so и импортировать ее в Python, вызывать foobar_main из Python, и все работает нормально.

Вторая часть связывается с первой с помощью некоторых респектабельных конструкций C++. В частности: первая часть создает некоторые отдельные объекты некоторых классов, а вторая часть использует статические методы класса для получения этих объектов.

Теперь я хочу запустить только первую часть из main() и вторую часть из Python. То есть, я хочу запустить программу C++ foobar а затем, после завершения первой части, запустите скрипт Python (программно из C++), который продолжается со второй частью.

Для этого я:

  • скомпилируйте вторую часть и оболочку SWIG в foobar2.so
  • замените вторую часть кода C++ на system("python foobar2.py")
  • скомпилировать измененную C++ программу foobar1.so и загрузить в foobar
  • напишите сценарий foobar2.py который импортирует foobar1 и foobar2 а затем эквивалентен второй части

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

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

Теги:
swig
shared-libraries

1 ответ

1
Лучший ответ

Я собираюсь предположить, что ваш код C++ выглядит следующим образом:

void part1()
{}

void part2()
{}

int main()
{
    part1();
    part2();
}

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

Я думаю, что самый простой способ - обернуть part1() вместе с другими связанными с part2 функциями, а затем создать скрипт Python следующим образом:

import foobar

foobar.part1()
py_part2()

Это, конечно, означает, что программа запускается на Python. Если вам необходимо запустить программу C++ по какой-либо причине (т.е. Вам понадобится main()), то для использования py_part2() вам необходимо встроить интерпретатор Python в вашу программу C++. Это гораздо более сложный и сложный процесс, этот ответ имеет хорошую информацию о том, как начать работу.


Поскольку вы system("python foobar2.py") я объясню, почему system("python foobar2.py") не работает. В этой схеме ваша программа C++ запускает другой процесс (программу) с именем python, а затем ждет его завершения. Это две совершенно разные программы, которые в вашем случае не разговаривают друг с другом и не имеют ничего общего. Поэтому почему это не работает.

В общем, пересмотреть все, что связано с system. Его основное использование, по-видимому, заключается в том, чтобы указать начинающих программистов.

  • 0
    Нет, Адам, я прошу прощения, но вы, похоже, не понимаете моих вопросов. Я точно знаю, как делать то, что вы говорите мне делать. Я сказал вам в начале вопроса. Когда вы говорите «запустить другой процесс» и «две совершенно разные программы», я сожалею, в этом весь смысл использования общих библиотек - вот почему он должен работать так, как я пытаюсь сделать, из-за общих библиотек .so , Они должны позволять делиться символами между процессами.
  • 0
    да, действительно, я должен встраивать. Да, я не понимал, как работают компьютеры (подумав об этом, я, вероятно, до сих пор не понимаю). Спасибо, Адам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню