gpt4 book ai didi

try-catch - 在 Cython 中尝试 cimport 语句(与 mpi4py 一起使用)

转载 作者:行者123 更新时间:2023-12-03 06:49:38 28 4
gpt4 key购买 nike

有没有办法在 Cython 中为 cimport 提供相当于 Python try 语句的方法?

类似的事情:

try:
cimport something
except ImportError:
pass

我需要它来编写一个可以使用或不使用 mpi4py 进行编译的 Cython 扩展。这在编译语言中是非常标准的,其中 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])

最佳答案

以这种方式使用 try-catch block 是您无法做到的。您正在制作的扩展模块必须针对它使用 cimport 在 C 级别加载的内容进行静态编译和链接。 try-catch block 是在导入模块时执行的,而不是在编译模块时执行的。

另一方面,理论上,您应该能够使用 Cython 的 support for conditional compilation 获得您正在寻找的效果。 。在您的 setup.py 文件中,您可以检查是否定义了所需的模块,然后定义要传递给 Cython 编译器的环境变量,而环境变量又取决于是否定义了所需的模块存在。

one of Cython's tests 中有一个如何执行此操作的示例。在那里,他们将包含所需环境变量的字典作为关键字参数 pyrex_compile_time_env 传递给 Cython 的 Extension 类的构造函数,该参数为 renamedcython_compile_time_env,并且 Cython.Build.Dependency.cythonize 被称为 compile_time_env )。

关于try-catch - 在 Cython 中尝试 cimport 语句(与 mpi4py 一起使用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26225187/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com