AttributeError:“list”对象没有使用petsc4py的属性“rfind”

2024-10-01 15:36:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用petsc4py和cython的组合时遇到了一个错误: AttributeError:“list”对象没有属性“rfind”

下面的代码是…/petsc4py/demo/wrap cython的一部分/设置.py,项目的一个示例,其中有一个错误:

def configuration(parent_package='',top_path=None):
INCLUDE_DIRS = []
LIBRARY_DIRS = []
LIBRARIES    = []

# PETSc
import os
PETSC_DIR  = os.environ['PETSC_DIR']
PETSC_ARCH = os.environ.get('PETSC_ARCH', '')
from os.path import join, isdir
if PETSC_ARCH and isdir(join(PETSC_DIR, PETSC_ARCH)):
    INCLUDE_DIRS += [join(PETSC_DIR, PETSC_ARCH, 'include'),
                     join(PETSC_DIR, 'include')]
    LIBRARY_DIRS += [join(PETSC_DIR, PETSC_ARCH, 'lib')]
else:
    if PETSC_ARCH: pass # XXX should warn ...
    INCLUDE_DIRS += [join(PETSC_DIR, 'include')]
    LIBRARY_DIRS += [join(PETSC_DIR, 'lib')]
LIBRARIES += [#'petscts', 'petscsnes', 'petscksp',
              #'petscdm', 'petscmat',  'petscvec',
              'petsc']

# PETSc for Python
import petsc4py
INCLUDE_DIRS += [petsc4py.get_include()]

# Configuration
from numpy.distutils.misc_util import Configuration
config = Configuration('', parent_package, top_path)
config.add_extension('_Bratu3D',
                     sources = ['Bratu3D.pyx',
                                'Bratu3Dimpl.c'],
                     depends = ['Bratu3Dimpl.h'],
                     include_dirs=INCLUDE_DIRS + [os.curdir],
                     libraries=LIBRARIES,
                     library_dirs=LIBRARY_DIRS,
                     runtime_library_dirs=LIBRARY_DIRS)
return config

if __name__ == "__main__":
    from numpy.distutils.core import setup
    setup(**configuration(top_path='').todict())

错误消息包括:

^{pr2}$

另一个例子是…/petsc4py/demo/wrap swig/设置.py有几乎相同的代码,但没有任何错误。唯一的例外是:

config.add_extension('_Bratu3D',
                     sources = ['Bratu3D.i',
                                'Bratu3D.c'],
                     depends = ['Bratu3D.h'],
                     include_dirs=INCLUDE_DIRS + [os.curdir],
                     libraries=LIBRARIES,
                     library_dirs=LIBRARY_DIRS,
                     runtime_library_dirs=LIBRARY_DIRS)

非常感谢。在


Tags: pathimportincludeos错误dirlibrarydirs
3条回答

我给代码编写者发了一封电子邮件,他说numpydistutils的支持在不断发展,现在代码被破坏了。然后安装文件被重写。我已经测试过它在我的系统中运行良好。在

你需要添加

from Cython.Build import cythonize
config.ext_modules[-1] = cythonize(config.ext_modules[-1])

就在config.add_extension(...)之后

问题是sources最终包含了一个由{a1}添加的空列表。这是因为它本身不知道如何处理cython文件,所以您需要在模块上运行cythonize来告诉它如何处理(如cython documentation所示)。在

python调试器可以自己使用这个方法。运行python3 -m pdb setup.py -q build_ext inplace,键入cont使其初始运行。你会得到例外的。您可以键入up在堆栈中向上移动。在

(base, ext) = os.path.splitext(source)行键入print(source)以查看它是一个空列表。在

sources, py_files = self.filter_py_files(sources)行键入print(sources)查看{}。然后就是在第329行之前查看distutils/build_src.py(其中调用self.filter_py_files)来查看它可能出错的地方。在

我在这个项目上遇到了同样的问题petsc4py/demo/wrap-cython

实际上,代码可以很好地处理这个文件:numpy/distutils/command/build_src.py

该方法在numpy 1.11.0中定义为:

def generate_a_pyrex_source(self, base, ext_name, source, extension):
    """Pyrex is not supported, but some projects monkeypatch this method.

    That allows compiling Cython code, see gh-6955.
    This method will remain here for compatibility reasons.
    """
    return []

你必须用你自己的定义覆盖这个方法。下面是用python3.5.1、petsc4py 2.0.0测试的更新脚本:

包裹cython/设置.py

^{pr2}$

相关问题 更多 >

    热门问题