Попробуйте оператор в Cython для cimport (для использования с mpi4py)

Есть ли способ иметь эквивалент оператора try Python в Cython для cimport?

Что-то вроде того:

try:
    cimport something
except ImportError:
    pass

Мне нужно это, чтобы написать расширение Cython, которое может быть скомпилировано с или без mpi4py. Это очень стандартно в скомпилированных языках, где команды mpi могут быть помещены между директивами препроцессора #ifdef и #endif. Как мы можем получить такой же результат в Cython?

Я пробовал это, но это не работает:

try:
    from mpi4py import MPI
    from mpi4py cimport MPI
    from mpi4py.mpi_c cimport *
except ImportError:
    rank = 0
    nb_proc = 1

# solve a incompatibility between openmpi and mpi4py versions
cdef extern from 'mpi-compat.h': pass

does_it_work = 'Not yet'

На самом деле это работает хорошо, если mpi4py правильно установлен, но еслиimport mpi4py вызывает ImportError, файл Cython не компилируется, и я получаю ошибку:

Error compiling Cython file:
------------------------------------------------------------
...

try:
    from mpi4py import MPI
    from mpi4py cimport MPI
   ^
------------------------------------------------------------

mod.pyx:4:4: 'mpi4py.pxd' not found

Файлsetup.py:

from setuptools import setup, Extension
from Cython.Distutils import build_ext

import os
here = os.path.abspath(os.path.dirname(__file__))

include_dirs = [here]

try:
    import mpi4py
except ImportError:
    pass
else:
    INCLUDE_MPI = '/usr/lib/openmpi/include'
    include_dirs.extend([
        INCLUDE_MPI,
        mpi4py.get_include()])

name = 'mod'
ext = Extension(
    name,
    include_dirs=include_dirs,
    sources=['mod.pyx'])

setup(name=name,
      cmdclass={"build_ext": build_ext},
      ext_modules=[ext])

Ответы на вопрос(2)

Ваш ответ на вопрос