Python зависает при импорте сгенерированной оболочки Swig

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

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

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

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

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

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

Затем мы попытались извлечь функции в простую программу 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 и include/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

Спасибо, Эй Джей.


person AJ.    schedule 22.07.2009    source источник


Ответы (1)


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

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

person lazy1    schedule 28.07.2009