simonpercivall / orderedset

Ordered Set implementation in Cython
Other
74 stars 14 forks source link

Does not build when installed via Python3.7+ #27

Closed Jayjader closed 4 years ago

Jayjader commented 4 years ago

Attempting to install orderedset via pip in python3.7 and 3.8 fails with error containing message error: command 'gcc' failed with exit status 1.

Steps to reproduce (lines prefixed by $ contain the commands):

$ python3.7 -m venv venv37
$ ./venv37/bin/pip install orderedset
Collecting orderedset
  Downloading https://files.pythonhosted.org/packages/d6/04/04150a0fd248844e7265f14789f3b36493f8235a27de103d0f0f19a12f61/orderedset-2.0.2.tar.gz (79kB)
     |████████████████████████████████| 81kB 1.1MB/s
Installing collected packages: orderedset
  Running setup.py install for orderedset ... error
    ERROR: Command errored out with exit status 1:
     command: /tmp/venv37/bin/python3.7 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-laof2akp/orderedset/setup.py'"'"'; __file__='"'"'/tmp/pip-install-laof2akp/orderedset/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-tl7wjx11/install-record.txt --single-version-externally-managed --compile --install-headers /tmp/venv37/include/site/python3.7/orderedset
         cwd: /tmp/pip-install-laof2akp/orderedset/
    Complete output (39 lines):
    running install
    running build
    running build_py
    creating build
    creating build/lib.linux-x86_64-3.7
    creating build/lib.linux-x86_64-3.7/orderedset
    copying lib/orderedset/__init__.py -> build/lib.linux-x86_64-3.7/orderedset
    running build_ext
    building 'orderedset._orderedset' extension
    creating build/temp.linux-x86_64-3.7
    creating build/temp.linux-x86_64-3.7/lib
    creating build/temp.linux-x86_64-3.7/lib/orderedset
    gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fPIC -I/tmp/venv37/include -I/usr/include/python3.7m -c lib/orderedset/_orderedset.c -o build/temp.linux-x86_64-3.7/lib/orderedset/_orderedset.o
    lib/orderedset/_orderedset.c: In function ‘__Pyx__ExceptionSwap’:
    lib/orderedset/_orderedset.c:13976:24: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_type’; did you mean ‘curexc_type’?
    13976 |     tmp_type = tstate->exc_type;
          |                        ^~~~~~~~
          |                        curexc_type
    lib/orderedset/_orderedset.c:13977:25: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_value’; did you mean ‘curexc_value’?
    13977 |     tmp_value = tstate->exc_value;
          |                         ^~~~~~~~~
          |                         curexc_value
    lib/orderedset/_orderedset.c:13978:22: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_traceback’; did you mean ‘curexc_traceback’?
    13978 |     tmp_tb = tstate->exc_traceback;
          |                      ^~~~~~~~~~~~~
          |                      curexc_traceback
    lib/orderedset/_orderedset.c:13979:13: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_type’; did you mean ‘curexc_type’?
    13979 |     tstate->exc_type = *type;
          |             ^~~~~~~~
          |             curexc_type
    lib/orderedset/_orderedset.c:13980:13: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_value’; did you mean ‘curexc_value’?
    13980 |     tstate->exc_value = *value;
          |             ^~~~~~~~~
          |             curexc_value
    lib/orderedset/_orderedset.c:13981:13: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_traceback’; did you mean ‘curexc_traceback’?
    13981 |     tstate->exc_traceback = *tb;
          |             ^~~~~~~~~~~~~
          |             curexc_traceback
    error: command 'gcc' failed with exit status 1
    ----------------------------------------
ERROR: Command errored out with exit status 1: /tmp/venv37/bin/python3.7 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-laof2akp/orderedset/setup.py'"'"'; __file__='"'"'/tmp/pip-install-laof2akp/orderedset/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-tl7wjx11/install-record.txt --single-version-externally-managed --compile --install-headers /tmp/venv37/include/site/python3.7/orderedset Check the logs for full command output.

A quick search online yields these similar issues in other projects: 1 2, and in particular this comment seems to contain a possible fix.

The root idea appears to be that the cached C source files generated by Cython were not regenerated for release 2.0.2's enabling of use with python3.7 & 3.8, and thus contain symbols present in python3.6 but removed in 3.7 onwards. These cached files furthermore seem to be used when Cython is absent from the virtualenv. If Cython is already present, the C source files are generated on the spot, and seem to be compatible with the python version present (3.7 and 3.8).

Output in my terminal:

$ ./venv37/bin/pip install cython
Collecting cython
  Downloading https://files.pythonhosted.org/packages/17/49/5a2834a373417130b77d43b39a5a9a117d528e8d63ecb439555afef8b33d/Cython-0.29.15-cp37-cp37m-manylinux1_x86_64.whl (2.1MB)
     |████████████████████████████████| 2.1MB 2.0MB/s
Installing collected packages: cython
Successfully installed cython-0.29.15
$ ./venv37/bin/pip install orderedset
Collecting orderedset
  Using cached https://files.pythonhosted.org/packages/d6/04/04150a0fd248844e7265f14789f3b36493f8235a27de103d0f0f19a12f61/orderedset-2.0.2.tar.gz
Installing collected packages: orderedset
  Running setup.py install for orderedset ... done
Successfully installed orderedset-2.0.2

The apparent quick fix is to regenerate and republish the C source files to pypi.

Additionally, the comment I linked above mentions adding cython to the setup_requires argument to setup (sourcing this stackoverflow answer). However, I am unsure if this will work given discussion on other issues found on github, notably this comment.

For completeness's sake, installing with python3.8 fails with the same behavior, whereas using python3.6 succeeds.

Personal environment:

sblondon commented 4 years ago

I reproduce the bug on Debian testing (error when installing orderedset only, fixed by installing cython before installing orderedset).

Versions used:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux bullseye/sid
Release:    testing
Codename:   bullseye
$ uname -a
Linux foehn 5.4.0-4-amd64 #1 SMP Debian 5.4.19-1 (2020-02-13) x86_64 GNU/Linux
$ ./venv/bin/python --version
Python 3.7.6
$ ./venv/bin/pip --version
pip 20.0.2 from /tmp/xxx/venv/lib/python3.7/site-packages/pip (python 3.7)
d1618033 commented 4 years ago

I reproduced the bug when using the basic python:3.7 docker image (Debian GNU/Linux 10 (buster))

❯ docker run -it python:3.7 bash
root@e4465e1c01e0:/# pip install orderedset
simonpercivall commented 4 years ago

Thanks, was sure I had regenerated the C file, but apparently not. 2.0.3 out.