Search code examples
ubuntuipythonvirtualenvpypy

How to install iPython in a Pypy virtualenv on Ubuntu 17.04


I'm trying to install IPython in a virtualenv. I've set up my Virtualenv to use Pypy 2.7 instead of CPython 3.

When I use the IPython installed by apt-get, it ends up using CPython 3 instead of Pypy.

When I try to pip install ipython, I get a compilation error because it can't find the Python.h header file. This error is detailed here: https://askubuntu.com/questions/922302/install-ipython-with-pip-on-ubuntu-16-04. The suggested fix results in the error:

Can not perform a '--user' install. User site-packages are not visible in this virtualenv.

[edit]

The complete error:

Collecting ipython
  Using cached ipython-5.4.1-py2-none-any.whl
Requirement already satisfied: decorator in ./site-packages (from ipython)
Collecting pickleshare (from ipython)
  Using cached pickleshare-0.7.4-py2.py3-none-any.whl
Collecting prompt-toolkit<2.0.0,>=1.0.4 (from ipython)
  Using cached prompt_toolkit-1.0.15-py2-none-any.whl
Collecting pygments (from ipython)
  Using cached Pygments-2.2.0-py2.py3-none-any.whl
Requirement already satisfied: setuptools>=18.5 in ./site-packages (from ipython)
Collecting simplegeneric>0.8 (from ipython)
Collecting traitlets>=4.2 (from ipython)
  Using cached traitlets-4.3.2-py2.py3-none-any.whl
Collecting backports.shutil-get-terminal-size; python_version == "2.7" (from ipython)
  Using cached backports.shutil_get_terminal_size-1.0.0-py2.py3-none-any.whl
Collecting pathlib2; python_version == "2.7" or python_version == "3.3" (from ipython)
  Using cached pathlib2-2.3.0-py2.py3-none-any.whl
Collecting pexpect; sys_platform != "win32" (from ipython)
  Using cached pexpect-4.2.1-py2.py3-none-any.whl
Requirement already satisfied: six>=1.9.0 in ./site-packages (from prompt-toolkit<2.0.0,>=1.0.4->ipython)
Collecting wcwidth (from prompt-toolkit<2.0.0,>=1.0.4->ipython)
  Using cached wcwidth-0.1.7-py2.py3-none-any.whl
Collecting ipython-genutils (from traitlets>=4.2->ipython)
  Using cached ipython_genutils-0.2.0-py2.py3-none-any.whl
Requirement already satisfied: enum34; python_version == "2.7" in ./site-packages (from traitlets>=4.2->ipython)
Collecting scandir; python_version < "3.5" (from pathlib2; python_version == "2.7" or python_version == "3.3"->ipython)
  Using cached scandir-1.5.tar.gz
Collecting ptyprocess>=0.5 (from pexpect; sys_platform != "win32"->ipython)
  Using cached ptyprocess-0.5.2-py2.py3-none-any.whl
Building wheels for collected packages: scandir
  Running setup.py bdist_wheel for scandir ... error
  Complete output from command /home/me/Documents/pypy-ipython-venv/bin/pypy -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-FmKqsi/scandir/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /tmp/tmpseW7pdpip-wheel- --python-tag pp256:
  running bdist_wheel
  running build
  running build_py
  creating build
  creating build/lib.linux-x86_64-2.7
  copying scandir.py -> build/lib.linux-x86_64-2.7
  running build_ext
  building '_scandir' extension
  creating build/temp.linux-x86_64-2.7
  cc -O2 -fPIC -Wimplicit -I/home/me/Documents/pypy-ipython-venv/include -c _scandir.c -o build/temp.linux-x86_64-2.7/_scandir.o
  _scandir.c:14:20: fatal error: Python.h: No such file or directory
   #include <Python.h>
                      ^
  compilation terminated.
  error: command 'cc' failed with exit status 1

  ----------------------------------------
  Failed building wheel for scandir
  Running setup.py clean for scandir
Failed to build scandir
Installing collected packages: scandir, pathlib2, pickleshare, wcwidth, prompt-toolkit, pygments, simplegeneric, ipython-genutils, traitlets, backports.shutil-get-terminal-size, ptyprocess, pexpect, ipython
  Running setup.py install for scandir ... error
    Complete output from command /home/me/Documents/pypy-ipython-venv/bin/pypy -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-FmKqsi/scandir/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-RqBbsa-record/install-record.txt --single-version-externally-managed --compile --install-headers /home/me/Documents/pypy-ipython-venv/include/site/python2.7/scandir:
    running install
    running build
    running build_py
    creating build
    creating build/lib.linux-x86_64-2.7
    copying scandir.py -> build/lib.linux-x86_64-2.7
    running build_ext
    building '_scandir' extension
    creating build/temp.linux-x86_64-2.7
    cc -O2 -fPIC -Wimplicit -I/home/me/Documents/pypy-ipython-venv/include -c _scandir.c -o build/temp.linux-x86_64-2.7/_scandir.o
    _scandir.c:14:20: fatal error: Python.h: No such file or directory
     #include <Python.h>
                        ^
    compilation terminated.
    error: command 'cc' failed with exit status 1

    ----------------------------------------
Command "/home/me/Documents/pypy-ipython-venv/bin/pypy -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-FmKqsi/scandir/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-RqBbsa-record/install-record.txt --single-version-externally-managed --compile --install-headers /home/me/Documents/pypy-ipython-venv/include/site/python2.7/scandir" failed with error code 1 in /tmp/pip-build-FmKqsi/scandir/

Solution

  • You need to install pypy-dev before creating the virtualenv. You can see that the gcc command is looking for include files in /home/me/Documents/pypy-ipython-venv/include, I fear that directory only gets filled correctly if the header files are present when the virtual env is created. You can prove this by looking at the contents of that directory, it should have a Python.h file there.

    Note that you only need to install pypy-dev once, after that you should be good to go with as many virtualenvs as you choose to create