Python зависает при импорте Swig Generated Wrapper - PullRequest
3 голосов
/ 22 июля 2009

Python «зависает», когда я пытаюсь импортировать разделяемую библиотеку c ++ в версию python 2.5 для Windows, и я понятия не имею, почему.

В Linux все работает нормально. Мы можем скомпилировать весь наш код C ++, сгенерировать классы оболочки Swig. Они компилируются и могут быть импортированы и использованы в Python 2.5 или 2.6. Теперь мы пытаемся перенести код на Windows с помощью Cygwin.

Мы можем скомпилировать каждую из библиотек C ++ в общие библиотеки с помощью -mno-cygwin, что устраняет зависимость от cygwin1.dll. По сути это приводит к тому, что целью gcc будет CyGwin вместо MinGW, что позволяет запускать полученные двоичные файлы в Windows без какой-либо зависимости от Cygwin. Более того, каждая из этих общих библиотек может быть связана с двоичными файлами c ++ и успешно работать.

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

Следующим шагом был импорт сгенерированной оболочки Python в Python. Мы можем импортировать все наши библиотеки, кроме двух. Для двух, которые не работают, когда мы пытаемся импортировать файлы .py или .pyd в Windows Python (версия, скомпилированная с Visual C ++), Python зависает. Мы не можем убить Python с помощью Ctrl + C или Ctrl + D, единственный выход - убить его с помощью диспетчера задач. Если мы присоединяем gdb к процессу python и печатаем трассировку стека, мы в основном получаем мусор, ничего полезного.

Далее мы попытались определить блоки кода в файлах * .i и воссоздать swig-оболочки. Этот процесс, по крайней мере, позволил мне импортировать библиотеки в Windows Python, но проблема в том, что нам пришлось закомментировать слишком много функций, необходимых для работы программного обеспечения. В общем, нужно было закомментировать три типа функций: статические функции, виртуальные const-функции и обычные общедоступные функции, которые НЕ были объявлены как const. Это также воспроизводимо, если мы раскомментируем любую из этих функций, то импорт снова зависает.

Затем мы попытались извлечь функции в простую программу hello world, сгенерировать оболочку swig и импортировать их в python. Это сработало. Мы скопировали функции именно из заголовочных файлов. Они работают в очень маленькой тестовой программе, но не в большой общей библиотеке. Мы строим их точно так же.

Итак, любые идеи о том, почему это происходит, или даже просто о лучших методах отладки, будут очень полезны.

Они отлично работают в Linux с gcc 3 и 4 и python 2.5 и 2.6. В Windows это программное обеспечение, которое я использую: gcc 3.4.4 swig 1.39 (двоичные файлы Windows от swig.org) python 2.5.4 (двоичные файлы Windows и включает / libs из python.org)

Это команды, которые я использую для создания простой программы hello world (полная библиотека использует те же опции, но она намного длиннее из-за дополнительных опций -I, -L и -l)

swig -c ++ -python -o test_wrap.cc test.i

gcc -c -mno-cygwin test.cc

gcc -c -mno-cygwin test_wrap.cc -I / usr / python25 / include

dlltool --export-all --output-def _test.def test.o

gcc -mno-cygwin -shared -s test_wrap.o test.o -L / usr / python25 / libs -lpython25 -lstdc ++ -o _TestModule.pyd

Спасибо, AJ

1 Ответ

1 голос
/ 29 июля 2009

Техника, которую я использовал, заключается в том, чтобы вставить «жесткую» точку останова (__asm int 3) в функцию инициализации модуля. Затем либо запустите его через отладчик, либо просто запустите его и дайте возможность отладчику Windows появиться при вызове прерывания.

Вы можете скачать хороший отладчик Windows от Microsoft здесь .

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