Hi Satish,

Thanks for the reply.

I’ve done a bunch more tests and I think the issue is as you suggest the cython 
version (<3 and >=3 are very different).

My python installation has cython 0.29.37. However, when doing a pip install, 
pip insists on downloading cython>=3. The reason is that pyproject.toml and 
conf/confpetsc.py have this cython version as a requirement.

On the other hand, I can install petsc4py along with PETSc using 
--with-petsc4py=1 at configure time. If I understand things correctly, when 
petsc4py is installed along with PETSc, it builds the extension module using 
python (and not pip) so the requirements are likely ignored. In fact, if I hack 
pyproject.toml and confpetsc.py and set the source to the pre-packaged petsc4py 
in $PETSC_DIR/src/binding/petsc4py I get much further along with pip (not all 
the way though, but for other reasons).

From all this I’m fairly certain now that 3.21.1 is not compatible with 
cython>=3. Is it possible that the cython (and numpy) requirements on PyPI for 
older versions of PETSc/petsc4py are not correct?

Thanks,

Samar

On Aug 28, 2025, at 11:07 PM, Satish Balay <[email protected]> wrote:

On Thu, 28 Aug 2025, Samar Khatiwala via petsc-dev wrote:

Hello,

I’m trying to install petsc4py with pip on a machine with an existing PETSc 
(3.21.1) (installed without pets4py). When I do:

pip install -v petsc4py==3.21.1

the installation fails. (If I don’t specify the version pip just downloads the 
latest version and the installation fails in a different way, but that’s not 
surprising.)

I’ve attached the build log.

If I don’t specify PETSC_DIR etc and just do pip install petsc4py then that 
works. But I would like to use the existing installed PETSc (yes, I know it is 
quite old but please bear with me!).


 Successfully installed cython-3.1.3 numpy-2.0.2 setuptools-80.9.0
<snip>
 using Cython 3.1.3
 cythonizing 'petsc4py/PETSc.pyx' -> 'petsc4py/PETSc.c'
 warning: petsc4py/PETSc/petscis.pxi:196:4: '__getsegcount__' relates to the 
old Python 2 buffer protocol and is no longer used.
 warning: petsc4py/PETSc/petscis.pxi:201:4: '__getreadbuffer__' relates to the 
old Python 2 buffer protocol and is no longer used.
 warning: petsc4py/PETSc/petscvec.pxi:585:4: '__getsegcount__' relates to the 
old Python 2 buffer protocol and is no longer used.
 warning: petsc4py/PETSc/petscvec.pxi:590:4: '__getreadbuffer__' relates to the 
old Python 2 buffer protocol and is no longer used.
 warning: petsc4py/PETSc/petscvec.pxi:595:4: '__getwritebuffer__' relates to 
the old Python 2 buffer protocol and is no longer used.

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

     @classmethod
     def Print(
         cls,
         *args: Any,
         sep: str = ' ',
                    ^
 ------------------------------------------------------------

 petsc4py/PETSc/Sys.pyx:159:19: Compiler crash in ExpressionWriter


 Compiler crash traceback from this point on:
   File "Cython/Compiler/Visitor.py", line 174, in 
Cython.Compiler.Visitor.TreeVisitor._visit
   File 
"/private/var/folders/d3/w861tc0j755f19272xfkq56w0000gn/T/pip-install-1e_zq9u1/petsc4py_c977438422fb480b9f145e0099e7cf3e/conf/cyautodoc.py",
 line 28, in visit_UnicodeNode
     self.emit_string(node, '')
 AttributeError: 'ExpressionWriter' object has no attribute 'emit_string'
 error: Cython failure: 'petsc4py/PETSc.pyx' -> 'petsc4py/PETSc.c'
<<<

Perhaps you can try installing/using an older cython version - say 3.0.12 - and 
see if that works.

Satish

Reply via email to