pyenv install: 3.x BUILD FAILED (Ubuntu 20.04 using python-build 20180424)

Question:

Trying to install a new Python – version with pyenv on Ubuntu 20.04 WSL for Windows 10 fails with the following output:

username@hd1pcms0347:~$ pyenv install 3.9.4
Downloading Python-3.9.4.tar.xz...
-> https://www.python.org/ftp/python/3.9.4/Python-3.9.4.tar.xz
Installing Python-3.9.4...
python-build: use readline from homebrew

BUILD FAILED (Ubuntu 20.04 using python-build 20180424)

Inspect or clean up the working tree at /tmp/python-build.20210602162502.2268
Results logged to /tmp/python-build.20210602162502.2268.log

Last 10 log lines:
  File "/tmp/python-build.20210602162502.2268/Python-3.9.4/Lib/ensurepip/__init__.py", line 210, in _main
    return _bootstrap(
  File "/tmp/python-build.20210602162502.2268/Python-3.9.4/Lib/ensurepip/__init__.py", line 129, in _bootstrap
    return _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
  File "/tmp/python-build.20210602162502.2268/Python-3.9.4/Lib/ensurepip/__init__.py", line 38, in _run_pip
    return subprocess.run([sys.executable, "-c", code], check=True).returncode
  File "/tmp/python-build.20210602162502.2268/Python-3.9.4/Lib/subprocess.py", line 528, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['/tmp/python-build.20210602162502.2268/Python-3.9.4/python', '-c', 'nimport runpynimport sysnsys.path = ['/tmp/tmp7aa5f7ml/setuptools-49.2.1-py3-none-any.whl', '/tmp/tmp7aa5f7ml/pip-20.2.3-py2.py3-none-any.whl'] + sys.pathnsys.argv[1:] = ['install', '--no-cache-dir', '--no-index', '--find-links', '/tmp/tmp7aa5f7ml', '--root', '/', '--upgrade', 'setuptools', 'pip']nrunpy.run_module("pip", run_name="__main__", alter_sys=True)n']' returned non-zero exit status 1.
make: *** [Makefile:1255: install] Error 1

EDIT:
I had shared the log file earlier via GoogleDrive so that @Marlon Richert could give his nice answer based on its contents.

Asked By: Andreas L.

||

Answers:

These are the relevant parts of your log:

In file included from /tmp/python-build.20210602162502.2268/Python-3.9.4/Modules/_cursesmodule.c:113:
./Include/py_curses.h:36:10: fatal error: curses.h: No such file or directory
   36 | #include <curses.h>
      |          ^~~~~~~~~~
compilation terminated.

[...]

/tmp/python-build.20210602162502.2268/Python-3.9.4/Modules/_ctypes/_ctypes.c:107:10: fatal error: ffi.h: No such file or directory
  107 | #include <ffi.h>
      |          ^~~~~~~
compilation terminated.

Python build finished successfully!
The necessary bits to build these optional modules were not found:
_bz2                  _curses_panel         _dbm
_gdbm                 _lzma                 _sqlite3
_tkinter              _uuid                 zlib
To find the necessary bits, look in setup.py in detect_modules() for the module's name.


The following modules found by detect_modules() in setup.py, have been
built by the Makefile instead, as configured by the Setup files:
_abc                  atexit                pwd
time


Failed to build these modules:
_ctypes               _curses

[...]

Traceback (most recent call last):
  File "<frozen zipimport>", line 520, in _get_decompress_func
ModuleNotFoundError: No module named 'zlib'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<frozen zipimport>", line 568, in _get_data
  File "<frozen zipimport>", line 523, in _get_decompress_func
zipimport.ZipImportError: can't decompress data; zlib not available

It looks like you’re missing the dependencies that PyEnv requires for building Python. Since you’re using Ubuntu, run the following:

sudo apt update
sudo apt install 
    build-essential 
    curl 
    libbz2-dev 
    libffi-dev 
    liblzma-dev 
    libncursesw5-dev 
    libreadline-dev 
    libsqlite3-dev 
    libssl-dev 
    libxml2-dev 
    libxmlsec1-dev 
    llvm 
    make 
    tk-dev 
    wget 
    xz-utils 
    zlib1g-dev

Then try again.

Answered By: Marlon Richert

I had the same issue on Fedora 36 (no wsl, running as main OS) after installing pyenv via pyenv-installer and like marlon’s answer ( https://stackoverflow.com/a/67853440 ) it turned out to be a combination of missing dependencies from looking at the log file. What resolved it for me was

sudo dnf install ffi
sudo dnf install ffi-devel
sudo dnf install zlib
sudo dnf install zlib-devel

After that, python will install (e.g. via pyenv install 3.10.7) but you need install other libraries based on the warnings it gives. for example after installation the warnings I got was:

WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
WARNING: The Python curses extension was not compiled. Missing the ncurses lib?
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
WARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib?
WARNING: The Python tkinter extension was not compiled and GUI subsystem has been detected. Missing the Tk toolkit?
WARNING: The Python lzma extension was not compiled. Missing the lzma lib?

obviously, follow the rest of Marlon’s answer and install all the dependencies listed on https://github.com/pyenv/pyenv/wiki#suggested-build-environment

Answered By: Vivek Gani