Есть ли способ получить эквивалент инструкции try для Python в Cython для cimport?Пример утверждения в Cython для cimport (для использования с mpi4py)
Нечто подобное:
try:
cimport something
except ImportError:
pass
я должен был бы это написать расширение Cython, который может быть скомпилирован с или без mpi4py. Это очень стандартно на скомпилированных языках, где команды mpi могут быть помещены между префиксами #ifdef и #endif preprocessor. Как мы можем получить тот же результат в Китоне?
Я попытался это, но он не работает:
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])
Связанный: http://stackoverflow.com/questions/27273302/cython-conditional-compile-based-on-external-value-given-via-setuptools – dubiousjim