Error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_type’; did you mean ‘curexc_type’? when building a Cython extension
Asked Answered
D

2

9

I get the following error with Python 3.8 and I don't get that error with Python 3.6. How can I make it work with Python 3.8? In order to reproduce the error, please follow along here: https://github.com/davidstutz/mesh-fusion/issues/7

[3645:3637 0:2090] 11:04:08 Tue Jan 12 [mona@goku:pts/0 +1] ~/mesh-fusion/libfusiongpu
$ python setup.py build_ext --inplace
Added OpenMP
running build_ext
skipping 'cyfusion.cpp' Cython extension (up-to-date)
building 'cyfusion' extension
x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/home/mona/venv/tsdf/lib/python3.8/site-packages/numpy/core/include -I/home/mona/venv/tsdf/include -I/usr/include/python3.8 -c cyfusion.cpp -o build/temp.linux-x86_64-3.8/cyfusion.o -ffast-math -msse -msse2 -msse3 -msse4.2 -fopenmp
In file included from /home/mona/venv/tsdf/lib/python3.8/site-packages/numpy/core/include/numpy/ndarraytypes.h:1822,
                 from /home/mona/venv/tsdf/lib/python3.8/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,
                 from /home/mona/venv/tsdf/lib/python3.8/site-packages/numpy/core/include/numpy/arrayobject.h:4,
                 from cyfusion.cpp:531:
/home/mona/venv/tsdf/lib/python3.8/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning "Using deprecated NumPy API, disable it with " "#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp]
   17 | #warning "Using deprecated NumPy API, disable it with " \
      |  ^~~~~~~
cyfusion.cpp: In function ‘PyObject* PyInit_cyfusion()’:
cyfusion.cpp:22866:32: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22866 |   __pyx_type_8cyfusion_PyViews.tp_print = 0;
      |                                ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp:22866:32: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22866 |   __pyx_type_8cyfusion_PyViews.tp_print = 0;
      |                                ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp:22866:32: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22866 |   __pyx_type_8cyfusion_PyViews.tp_print = 0;
      |                                ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp:22871:33: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22871 |   __pyx_type_8cyfusion_PyVolume.tp_print = 0;
      |                                 ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp:22871:33: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22871 |   __pyx_type_8cyfusion_PyVolume.tp_print = 0;
      |                                 ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp:22871:33: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22871 |   __pyx_type_8cyfusion_PyVolume.tp_print = 0;
      |                                 ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp:22878:26: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22878 |   __pyx_type___pyx_array.tp_print = 0;
      |                          ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp:22878:26: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22878 |   __pyx_type___pyx_array.tp_print = 0;
      |                          ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp:22878:26: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22878 |   __pyx_type___pyx_array.tp_print = 0;
      |                          ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp:22883:32: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22883 |   __pyx_type___pyx_MemviewEnum.tp_print = 0;
      |                                ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp:22883:32: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22883 |   __pyx_type___pyx_MemviewEnum.tp_print = 0;
      |                                ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp:22883:32: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22883 |   __pyx_type___pyx_MemviewEnum.tp_print = 0;
      |                                ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp:22895:31: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22895 |   __pyx_type___pyx_memoryview.tp_print = 0;
      |                               ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp:22895:31: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22895 |   __pyx_type___pyx_memoryview.tp_print = 0;
      |                               ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp:22895:31: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22895 |   __pyx_type___pyx_memoryview.tp_print = 0;
      |                               ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp:22905:36: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22905 |   __pyx_type___pyx_memoryviewslice.tp_print = 0;
      |                                    ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp:22905:36: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22905 |   __pyx_type___pyx_memoryviewslice.tp_print = 0;
      |                                    ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp:22905:36: warning: ‘_typeobject::tp_print’ is deprecated [-Wdeprecated-declarations]
22905 |   __pyx_type___pyx_memoryviewslice.tp_print = 0;
      |                                    ^~~~~~~~
In file included from /usr/include/python3.8/object.h:746,
                 from /usr/include/python3.8/pytime.h:6,
                 from /usr/include/python3.8/Python.h:85,
                 from cyfusion.cpp:4:
/usr/include/python3.8/cpython/object.h:260:30: note: declared here
  260 |     Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
      |                              ^~~~~~~~
cyfusion.cpp: In function ‘void __Pyx__ExceptionSave(PyThreadState*, PyObject**, PyObject**, PyObject**)’:
cyfusion.cpp:24028:21: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_type’; did you mean ‘curexc_type’?
24028 |     *type = tstate->exc_type;
      |                     ^~~~~~~~
      |                     curexc_type
cyfusion.cpp:24029:22: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_value’; did you mean ‘curexc_value’?
24029 |     *value = tstate->exc_value;
      |                      ^~~~~~~~~
      |                      curexc_value
cyfusion.cpp:24030:19: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_traceback’; did you mean ‘curexc_traceback’?
24030 |     *tb = tstate->exc_traceback;
      |                   ^~~~~~~~~~~~~
      |                   curexc_traceback
cyfusion.cpp: In function ‘void __Pyx__ExceptionReset(PyThreadState*, PyObject*, PyObject*, PyObject*)’:
cyfusion.cpp:24037:24: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_type’; did you mean ‘curexc_type’?
24037 |     tmp_type = tstate->exc_type;
      |                        ^~~~~~~~
      |                        curexc_type
cyfusion.cpp:24038:25: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_value’; did you mean ‘curexc_value’?
24038 |     tmp_value = tstate->exc_value;
      |                         ^~~~~~~~~
      |                         curexc_value
cyfusion.cpp:24039:22: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_traceback’; did you mean ‘curexc_traceback’?
24039 |     tmp_tb = tstate->exc_traceback;
      |                      ^~~~~~~~~~~~~
      |                      curexc_traceback
cyfusion.cpp:24040:13: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_type’; did you mean ‘curexc_type’?
24040 |     tstate->exc_type = type;
      |             ^~~~~~~~
      |             curexc_type
cyfusion.cpp:24041:13: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_value’; did you mean ‘curexc_value’?
24041 |     tstate->exc_value = value;
      |             ^~~~~~~~~
      |             curexc_value
cyfusion.cpp:24042:13: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_traceback’; did you mean ‘curexc_traceback’?
24042 |     tstate->exc_traceback = tb;
      |             ^~~~~~~~~~~~~
      |             curexc_traceback
cyfusion.cpp: In function ‘int __Pyx__GetException(PyThreadState*, PyObject**, PyObject**, PyObject**)’:
cyfusion.cpp:24112:24: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_type’; did you mean ‘curexc_type’?
24112 |     tmp_type = tstate->exc_type;
      |                        ^~~~~~~~
      |                        curexc_type
cyfusion.cpp:24113:25: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_value’; did you mean ‘curexc_value’?
24113 |     tmp_value = tstate->exc_value;
      |                         ^~~~~~~~~
      |                         curexc_value
cyfusion.cpp:24114:22: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_traceback’; did you mean ‘curexc_traceback’?
24114 |     tmp_tb = tstate->exc_traceback;
      |                      ^~~~~~~~~~~~~
      |                      curexc_traceback
cyfusion.cpp:24115:13: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_type’; did you mean ‘curexc_type’?
24115 |     tstate->exc_type = local_type;
      |             ^~~~~~~~
      |             curexc_type
cyfusion.cpp:24116:13: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_value’; did you mean ‘curexc_value’?
24116 |     tstate->exc_value = local_value;
      |             ^~~~~~~~~
      |             curexc_value
cyfusion.cpp:24117:13: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_traceback’; did you mean ‘curexc_traceback’?
24117 |     tstate->exc_traceback = local_tb;
      |             ^~~~~~~~~~~~~
      |             curexc_traceback
cyfusion.cpp: In function ‘void __Pyx__ExceptionSwap(PyThreadState*, PyObject**, PyObject**, PyObject**)’:
cyfusion.cpp:24354:24: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_type’; did you mean ‘curexc_type’?
24354 |     tmp_type = tstate->exc_type;
      |                        ^~~~~~~~
      |                        curexc_type
cyfusion.cpp:24355:25: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_value’; did you mean ‘curexc_value’?
24355 |     tmp_value = tstate->exc_value;
      |                         ^~~~~~~~~
      |                         curexc_value
cyfusion.cpp:24356:22: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_traceback’; did you mean ‘curexc_traceback’?
24356 |     tmp_tb = tstate->exc_traceback;
      |                      ^~~~~~~~~~~~~
      |                      curexc_traceback
cyfusion.cpp:24357:13: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_type’; did you mean ‘curexc_type’?
24357 |     tstate->exc_type = *type;
      |             ^~~~~~~~
      |             curexc_type
cyfusion.cpp:24358:13: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_value’; did you mean ‘curexc_value’?
24358 |     tstate->exc_value = *value;
      |             ^~~~~~~~~
      |             curexc_value
cyfusion.cpp:24359:13: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_traceback’; did you mean ‘curexc_traceback’?
24359 |     tstate->exc_traceback = *tb;
      |             ^~~~~~~~~~~~~
      |             curexc_traceback
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
19149/31772MB(tsdf) 


I have:

$ pip --version
pip 20.3.3 from /home/mona/venv/tsdf/lib/python3.8/site-packages/pip (python 3.8)
19149/31772MB(tsdf) 
[3645:3637 0:2092] 11:06:58 Tue Jan 12 [mona@goku:pts/0 +1] ~/mesh-fusion/libfusiongpu
$ python
Python 3.8.5 (default, Jul 28 2020, 12:59:40) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cython
>>> cython.__version__
'0.29.21'
>>> quit()
19149/31772MB(tsdf) 
[3645:3637 0:2093] 11:07:14 Tue Jan 12 [mona@goku:pts/0 +1] ~/mesh-fusion/libfusiongpu
$ lsb_release -a
LSB Version:    core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.1 LTS
Release:    20.04
Codename:   focal
19365/31772MB(tsdf) 
Deliberative answered 13/1, 2021 at 4:35 Comment(0)
A
4

Force the rebuild/regeneration of cythonized files with -f(or --force), i.e.:

python setup.py build_ext -i -f

or if using pip:

pip install --global-option build --global-option --force .

which can be roughly interpreted as: prior to installing run build (which includes build_ext) with option ´--force`.


The issue at hand is, that Cython produces c/cpp-files which might become incompatible in the future with new Python versions.

An example is, that Cython 0.27 didn't have support for Python3.8, because Python3.8 didn't yet exist back then. Thus, c/cpp-files created with Cython 0.27 (e.g. cyfusion.cpp from git-repository) won't build with Py3.8+-headers.

distutilsuses timestamps to decide whether a file should be rebuild/regenerated/recythonized and as far as it is concerned, the Cython-generated cyfusion.cpp-file is up-to-date - because cyfusion.pyx wasn't changed after its generation. The whole different-Python/Cython-version-business isn't taken into the consideration at all.

Thus, forcing the distutils to rebuild everything resolves the issue of outdated c/cpp-files.

In general, I don't think it is a good idea to put the cython-generated files into the distribution/git, as it might/will be become a stumbling block in the future, there are some examples of this:

  • "“tp_print is not a member of _typeobject”"-error for Python3.9+ (e.g. this post)
  • older cython versions have no attribute __reduce_cython__ (e.g. this post)

Another possible fix is to delete the outdated (cython-generated) cyfusion.cpp-file from distribution/git-repository and to run

python setup.py build_ext -i

afterwards.

Affinal answered 13/1, 2021 at 6:26 Comment(3)
Thanks a lot for your response. I did as you suggested and got this error pastebin.com/raw/fNuFwXSJDeliberative
@MonaJalal you didn’t use -f/--force when building in place. You either install with pip or build in place. There is no point in doing both.Affinal
Note: --build-option and --global-option are deprecated. They suggest there "possibility" will be another way to do the same thing. Ain't Python great? :/Selie
S
1

my problem solved by changing

python setup.py build_ext --inplace

to

python setup.py build_ext --inplace -force
Sculley answered 7/3, 2021 at 11:49 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.