CPython: динамический модуль не определяет ошибку функции экспорта модуля - PullRequest
0 голосов
/ 06 июня 2018

Я только что успешно скомпилировал свою оболочку Python для классов C ++.Тем не менее, я получаю следующие сообщения при попытке загрузить свой модуль в Python (через import cell):

ImportError: dynamic module does not define module export function (PyInit_cell)

Я проверил, что система использует Python3 во всех случаях, так что это непроблема версии Python.
Ниже приведен мой setup.py файл:

from distutils.core import setup, Extension
from Cython.Build import cythonize

setup(ext_modules = cythonize(Extension(
           "cell",                                
           sources=["cell.pyx", "cell.cc"],     
           language="c++",                       
           extra_compile_args=["-std=c++11"],
      )))

Ниже приведен дамп для сгенерированного .so файла:

0000000000201020 B __bss_start
0000000000201020 b completed.7594
                 w __cxa_finalize@@GLIBC_2.2.5
0000000000000530 t deregister_tm_clones
00000000000005c0 t __do_global_dtors_aux
0000000000200de8 t __do_global_dtors_aux_fini_array_entry
0000000000201018 d __dso_handle
0000000000200df8 d _DYNAMIC
0000000000201020 D _edata
0000000000201028 B _end
0000000000000630 T _fini
0000000000000600 t frame_dummy
0000000000200de0 t __frame_dummy_init_array_entry
0000000000000640 r __FRAME_END__
0000000000201000 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
00000000000004e8 T _init
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
0000000000200df0 d __JCR_END__
0000000000200df0 d __JCR_LIST__
                 w _Jv_RegisterClasses
0000000000000570 t register_tm_clones
0000000000201020 d __TMC_END__

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

Любая помощь будет оценена!

1 Ответ

0 голосов
/ 06 июня 2018

Вы не должны называть свой добавочный номер / модуль cell.pyx, называть его по-другому - например, cycell.pyx.

Почему?Следующие шаги предпринимаются при построении расширения

  1. Cython создает файл cell.cpp из cell.pyx.
  2. Компилятор компилирует cell.cpp в объектный файл cell.o.
  3. Компилятор компилирует cell.cc в объектный файл cell.o и перезаписывает объектный файл, созданный из cell.pyx.
  4. Компоновщик связывает оба cell.o файла (но на самом деле это только один)- в результате нет ничего, что было определено в cell.pyx / cell.cpp, в частности PyInit_cell.

Переименовывая Cython-файл, вы избегаете перезаписи объектного файла.

Очевидно, что другой вариант - переименовать ваш c ++ - файл.

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