2

I'm trying to install pynput in Termux to be able to run my python script. When I try [as in the attached screenshot] pip install pynput I get this error message:

ERROR: Command errored out with exit status 1:
     command: /data/data/com.termux/files/usr/bin/python3 -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/data/data/com.termux/files/usr/tmp/pip-install-f07stt3a/evdev_9d15119a1c774b69be29371e48a8012d/setup.py'"'"'; __file__='"'"'/data/data/com.termux/files/usr/tmp/pip-install-f07stt3a/evdev_9d15119a1c774b69be29371e48a8012d/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /data/data/com.termux/files/usr/tmp/pip-record-u2bumfem/install-record.txt --single-version-externally-managed --compile --install-headers /data/data/com.termux/files/usr/include/python3.9/evdev
         cwd: /data/data/com.termux/files/usr/tmp/pip-install-f07stt3a/evdev_9d15119a1c774b69be29371e48a8012d/
    Complete output (37 lines):
    running install
    running build
    running build_py
    creating build
    creating build/lib.linux-aarch64-3.9
    creating build/lib.linux-aarch64-3.9/evdev
    copying evdev/__init__.py -> build/lib.linux-aarch64-3.9/evdev
    copying evdev/device.py -> build/lib.linux-aarch64-3.9/evdev
    copying evdev/ecodes.py -> build/lib.linux-aarch64-3.9/evdev
    copying evdev/eventio.py -> build/lib.linux-aarch64-3.9/evdev
    copying evdev/eventio_async.py -> build/lib.linux-aarch64-3.9/evdev
    copying evdev/events.py -> build/lib.linux-aarch64-3.9/evdev
    copying evdev/evtest.py -> build/lib.linux-aarch64-3.9/evdev
    copying evdev/ff.py -> build/lib.linux-aarch64-3.9/evdev
    copying evdev/genecodes.py -> build/lib.linux-aarch64-3.9/evdev
    copying evdev/uinput.py -> build/lib.linux-aarch64-3.9/evdev
    copying evdev/util.py -> build/lib.linux-aarch64-3.9/evdev
    running build_ext
    running build_ecodes
    The 'linux/input.h' and 'linux/input-event-codes.h' include files
    are missing. You will have to install the kernel header files in
    order to continue:

        yum install kernel-headers-$(uname -r)
        apt-get install linux-headers-$(uname -r)
        emerge sys-kernel/linux-headers
        pacman -S kernel-headers

    In case they are installed in a non-standard location, you may use
    the '--evdev-headers' option to specify one or more colon-separated
    paths. For example:

        python setup.py \
          build \
          build_ecodes --evdev-headers path/input.h:path/input-event-codes.h \
          build_ext --include-dirs  path/ \
          install
    ----------------------------------------
ERROR: Command errored out with exit status 1: /data/data/com.termux/files/usr/bin/python3 -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/data/data/com.termux/files/usr/tmp/pip-install-f07stt3a/evdev_9d15119a1c774b69be29371e48a8012d/setup.py'"'"'; __file__='"'"'/data/data/com.termux/files/usr/tmp/pip-install-f07stt3a/evdev_9d15119a1c774b69be29371e48a8012d/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /data/data/com.termux/files/usr/tmp/pip-record-u2bumfem/install-record.txt --single-version-externally-managed --compile --install-headers /data/data/com.termux/files/usr/include/python3.9/evdev Check the logs for full command output.

I am not aware of what to do next. Please help.

UltraStudioLTD
  • 300
  • 2
  • 14
rey_track
  • 31
  • 3

3 Answers3

2

You get error due Termux not having kernel header files which is needed for evdev. Without it it is impossible to install pynput and other modules which require evdev. Regarding your question about command to install it error message already contains it:

    yum install kernel-headers-$(uname -r)
    apt-get install linux-headers-$(uname -r)
    emerge sys-kernel/linux-headers
    pacman -S kernel-headers

BUT DON'T TRY IT

I am not saying that something bad will happen. It just won't work. There are no kernel header files in Termux's repositories and as far as I know only option to install them without risks is to use proot. So you need to do this:

apt update # Update package repositor(y|ies)
apt upgrade # Upgrade everything just in case
apt install proot # Install **proot**
apt install proot-distro # [OPTIONAL] Install official (made by Termux's developer) proot installer

If you installed proot-distro then do this: proot-distro list # List current available distros Then

  1. Install distro which you want
  2. Start it
  3. Install python (and what you need) again using that distro's install commands since proot is like Virtual Machine
  4. Install kernel header files. CHOOSE COMMAND ACCORDING YOUR PROOT DISTRO
  5. Run pip install pynput
UltraStudioLTD
  • 300
  • 2
  • 14
1

I had the same error message installing evdev for a different package (quantconnect's "lean"); installing the prerequisites fixed the issue. From the man page (I quote debian but pick your distribution):

The latest stable version of python-evdev can be installed from pypi, provided that you have gcc/clang, pip and the Python and Linux development headers installed on your system. Installing them is distribution specific and typically falls in one of the following categories:

   On a Debian compatible OS:

      $ apt-get install python-dev python-pip gcc
      $ apt-get install linux-headers-$(uname -r)
0

Unix text and keyboard event handling has been handled nicely in curses and ncurses for decades and works in python in Termux. This example works so long as you zoom out the Termux window (pinch zoom out) so it doesn't run into bounding errors while moving the cursor around.

https://medium.com/explorations-in-python/an-introduction-to-curses-in-python-7686b9641190

import curses


def main():

    """
    The curses.wrapper function is an optional function that
    encapsulates a number of lower-level setup and teardown
    functions, and takes a single function to run when
    the initializations have taken place.
    """

    curses.wrapper(curses_main)


def curses_main(w):

    """
    This function is called curses_main to emphasise that it is
    the logical if not actual main function, called by curses.wrapper.
    Its purpose is to call several other functions to demonstrate
    some of the functionality of curses.
    """

    w.addstr("-----------------\n")
    w.addstr("| codedrome.com |\n")
    w.addstr("| curses demo   |\n")
    w.addstr("-----------------\n")
    w.refresh()

    printing(w)

    moving_and_sleeping(w)

    colouring(w)

    w.addstr("\npress any key to exit...")
    w.refresh()
    w.getch()


def printing(w):

    """
    A few simple demonstrations of printing.
    """

    w.addstr("This was printed using addstr\n\n")
    w.refresh()

    w.addstr("The following letter was printed using addch:- ")
    w.addch('a')
    w.refresh()

    w.addstr("\n\nThese numbers were printed using addstr:-\n{}\n{:.6f}\n".format(123, 456.789))
    w.refresh()


def moving_and_sleeping(w):

    """
    Demonstrates moving the cursor to a specified position before printing,
    and sleeping for a specified period of time.
    These are useful for very basic animations.
    """

    row = 5
    col = 0

    curses.curs_set(False)

    for c in range(65, 91):

        w.addstr(row, col, chr(c))
        w.refresh()
        row += 1
        col += 1
        curses.napms(100)

    curses.curs_set(True)

    w.addch('\n')


def colouring(w):

    """
    Demonstration of setting background and foreground colours.
    """

    if curses.has_colors():

        curses.init_pair(1, curses.COLOR_YELLOW, curses.COLOR_RED)
        curses.init_pair(2, curses.COLOR_GREEN, curses.COLOR_GREEN)
        curses.init_pair(3, curses.COLOR_MAGENTA, curses.COLOR_CYAN)

        w.addstr("Yellow on red\n\n", curses.color_pair(1))
        w.refresh()

        w.addstr("Green on green + bold\n\n", curses.color_pair(2) | curses.A_BOLD)
        w.refresh()

        w.addstr("Magenta on cyan\n", curses.color_pair(3))
        w.refresh()

    else:

        w.addstr("has_colors() = False\n");
        w.refresh()


main() 

fieldlab
  • 1
  • 3