WedX - журнал о программировании и компьютерных науках

Невозможно избежать компиляции Cython внешнего модуля C в Python2.7, а не в Python3.x

Этот вопрос связан с парой вопросов в SO, например этот и этот другой . К сожалению, решение пока не работает для меня. У меня есть файл module.pxc, который я компилирую с помощью файла setup.py, такого как следующий:

# setup.py

module_extension = Extension(
name="iolif",
sources=["/home/maurizio/Ongoing.Projects/c_libraries/dcomplex_libc.c",
         "/home/maurizio/Ongoing.Projects/c_libraries/special_functions_libc.c",
         "/home/maurizio/Ongoing.Projects/c_libraries/models/freq_cv_libc.c",
         "module.pyx"],
libraries=['gsl', 'gslcblas', 'm'],
# library_dirs=["lib"],
include_dirs=["/home/maurizio/Ongoing.Projects/pycustommodules",
              "/home/maurizio/Ongoing.Projects/c_libraries",
              "/home/maurizio/Ongoing.Projects/c_libraries/models"]
)
setup(
    name="iolif",
    ext_modules=cythonize([module_extension])
)   

Из командной строки, в том же каталоге module.pxc, при записи компиляция python setup.py build_ext --inplace работает нормально, и создается библиотека iolif.so. Проблема в том, что я могу импортировать эту библиотеку только в том случае, если я использую Python2.7, тогда как если я попытаюсь импортировать ее в Python3.x, я получу известную ImportError: dynamic module does not define module export function (PyInit_iolif).

Погуглив, и, как указано в двух вопросах, связанных выше, кажется, что это связано с тем, что cython смотрит на Python2.7, а не на Python3.x (с которым я вместо этого работаю). Соответственно, я попытался попросить cythonize в моем setup.py использовать Python3.x следующим образом:

...
setup(
    name="iolif",
    ext_modules=cythonize([module_extension],
                           compiler_directives={'language_level': "3"})
)       

но это все еще не работает. Последнее сообщение компиляции действительно производит:

gcc -pthread -shared -Wl,-z,relro -Wl,--as-needed -Wl,-z,now - 
specs=/usr/lib/rpm/redhat/redhat-hardened-ld build/temp.linux-x86_64-2.7/pylif_io.o 
build/temp.linux-x86_64-2.7/home/maurizio/Ongoing.Projects/c_libraries/dcomplex_libc.o 
build/temp.linux-x86_64-2.7/home/maurizio/Ongoing.Projects/c_libraries/special_functions_libc.o build/temp.linux-x86_64-2.7/home/maurizio/Ongoing.Projects/c_libraries/models/freq_cv_libc.o -L/usr/lib64 
-lgsl -lgslcblas -lm -lpython2.7 -o /home/maurizio/Ongoing.Projects/DePitta.PNAS/Software/LIF.Analysis/iolif.so

где вы можете видеть, что он все еще связан с библиотекой -lpython2.7 (тогда как он должен использовать, например, -lpython3.7m). Как мне это решить? Что мне не хватает?


  • Вы должны вызывать setup.py с Python3, а не с Python2. Именно так работают distutils. 04.02.2020

Ответы:


1

Простое решение. Моя команда python все еще была связана с python2.7 (я недавно перешел на Python3.x). Прошу прещения за это. Следовательно:

python3 setup.py build_ext --inplace

сделает трюк. На самом деле компиляция теперь гласит:

gcc -pthread -shared -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -g build/temp.linux-x86_64-3.7/pylif_io.o build/temp.linux-x86_64-3.7/home/maurizio/Ongoing.Projects/c_libraries/dcomplex_libc.o build/temp.linux-x86_64-3.7/home/maurizio/Ongoing.Projects/c_libraries/special_functions_libc.o build/temp.linux-x86_64-3.7/home/maurizio/Ongoing.Projects/c_libraries/models/freq_cv_libc.o -L/usr/lib64 -lgsl -lgslcblas -lm -lpython3.7m -o /home/maurizio/Ongoing.Projects/DePitta.PNAS/Software/LIF.Analysis/iolif.cpython-37m-x86_64-linux-gnu.so

как требуется.

04.02.2020
  • @samcarter_is_at_topanswers.xyz Спасибо. Я так и думал. Но тогда это не решает проблему. AR не предоставлялась для Linux с незапамятных времен. И другие параметры представления, такие как pdfpc, не будут работать в GNOME. Кроме того, Fedora 30+ использует Wayland, что еще больше усложняет ситуацию... 07.06.2020
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]