Search code examples
pythonpython-3.xtkinterpyinstallergoogle-chrome-os

Install Python 3 on Cloudready/Chromium/Chrome OS without installing Linux containers/environments


Recently I installed Neverware's version of Chromium OS, called Cloudready, on VirtualBox 6.1, to develop Python apps for Chromebooks. This version of Chromium OS is 48.0.2564.116 developer build (newer versions won't install due to graphics incompatibilities). As I do not have a Google Account, I login into Chromium OS as Guest user (somehow I have administrative powers as Guest, which is good for my developmental purposes).

I found that Python 2.7.3 was preinstalled. I tried to install Python 3.6, and to do so, I tried to find the preinstalled package manager, which I eventually found. The package manager that is preinstalled (portage), doesn't install anything, because it gives errors similar to this one:

chronos@localhost / $ sudo emerge dev-lang/python:3.6
!!! PORTAGE_BINHOST unset, but use is requested.
!!! Problem with sandbox library. Disabling...

Calculating dependencies... done!

WARNING: A requested package will not be merged because it is listed in
package.provided:

  dev-lang/python:3.6 pulled in by 'args'

>>> Auto-cleaning packages...

>>> No outdated packages were found on your system.
chronos@localhost / $

I tried installing Python PIP for Python 2 from the get-pip.py script provided here, and it worked. Because I want to create graphical interfaces for my programs for Chromebooks, I wanted to install the tkinter module, and because I didn't want the users of my programs to have to use the Terminal to execute my Python programs and install Python modules, I wanted to install PyInstaller. I wanted to install PyInstaller through PIP, but PIP throws the following error for any attempted module installation:

/usr/local/lib64/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.py:387: SNIMissingWarning: An HTTPS requ
est has been made, but the SNI (Server Name Indication) extension to TLS is not available on this platform. Thi
s may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can up
grade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/l
atest/advanced-usage.html#ssl.warnings
  SNIMissingWarning,
/usr/local/lib64/python2.7/site-packages/pip_vendor/urllib3/util/ssl_.py:142: InsecurePlatformWarning: A true
SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause cert
ain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information,
see https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecurePlatformWarning,

When trying to install PyInstaller, PIP actually managed to collect the pyinstaller-4.0.tar.gz package, but it fails upon installation because the PyInstaller installer raises an exception/error BackendUnavailable, and then PIP raises the InsecurePlatformWarning error again. As pointed out by @BryanOakley, I cannot install Tkinter from PIP, which I forgot while I was using Chromium OS (for example, the command to install Tkinter on Ubuntu is sudo apt-get install python3-tk), which makes things even trickier.

From the errors raised, it appears that I have to install a newer version of Python (which I have already tried, to no avail). I tried to install Python 3 by installing Anaconda 3 and then Miniconda 3, but both provide the same error, and I have even looked through Stack Overflow and what people had voted as the answer still did not work for me. The following commands...

$ mkdir ~/Downloads/TMP
$ TMPDIR=~/Downloads/TMP sudo bash ~/Downloads/Miniconda3-latest-Linux-x86_64.sh -p /usr/local/miniconda3

...eventually result in this output:

/usr/local/miniconda3/conda.exe: error while loading shared libraries: libz.so.1: failed to segment from sh
ared object: Operation not permitted
/usr/local/miniconda3/conda.exe: error while loading shared libraries: libz.so.1: failed to segment from sh
ared object: Operation not permitted

Nothing has worked thus far. How can I successfully install Python 3.6 with Tkinter and PyInstaller on Chromium OS Version 48 without installing Linux containers/environments (such as the option to install the official Linux (Beta) or Crouton) or installing anything from the Google Play Store?


Solution

  • The answer that explains why Miniconda doesn't install was correct that /tmp is mounted as noexec (mounted with no executable permission). Unfortunately, their suggested approach to fix it (specify a different TMPDIR directory for installation) did not work for me. However, I eventually managed to find a different approach.

    So, reboot the Chromebook and enter Developer Mode. Open the Crosh (Chrome Developer Shell) and type in the command shell to access the hidden Bash shell (as I am using Chromium OS developer build, not Chrome OS, I do not need to enter a developer mode to access the Bash shell).

    Now, instead of specifying a different TMPDIR directory as suggested in the answer I've referenced earlier, remount tmp as exec (with executable permission):

    sudo mount /tmp -o remount,exec
    

    When prompted for a password, type in the password for user chronos. There are (apparently) several different default passwords for chronos, including facepunch, password, chrome, localhost, test0000, and a blank password (nothing). In my case it was chrome. If you are using an official Chromebook and have booted into Developer Mode, you should have set a password with chromeos-setdevpasswd when enabling Developer Mode (for more information click here).

    After that, download the Miniconda installation script for Linux from the Conda website (remember to download the 64-bit version though), change the working directory to the location of the downloaded Miniconda installation script file, run it, and change the install location to a location with write privileges (in my case /usr/local/conda3).

    cd ~/Downloads
    sudo bash ~/Downloads/Miniconda3-latest-Linux-x86_64.sh -p /usr/local/conda3
    

    When installation finishes, you must add your Conda installation to PATH:

    echo "PATH=/usr/local/conda3/bin:$PATH" >> ~/.bashrc
    

    Restart the Crosh and enter the Bash shell again. Verify that the directory of the installed Conda binaries is in PATH with echo $PATH and if /usr/local/conda3/bin is in PATH, verify that Python is installed with python3 --version.

    Now it is time to install other modules. The installation of Miniconda includes the package manager Conda which specifically installs Python packages (however, there are some other packages available in Conda, such as GCC). Using Conda, you can install Tkinter, PyInstaller, and many other Python packages:

    conda install -c anaconda tk
    conda install -c anaconda pyinstaller
    

    Installing PyInstaller works, but it appears that on Chromium OS, there is no such tool as objcopy, meaning that PyInstaller cannot compile any Python scripts, and, as explained in the PyInstaller requirements, ldd, objcopy, and objdump must be installed for PyInstaller to work on Linux installations. The workaround for this is to compile Python scripts with PyInstaller on another Linux computer and then run the compiled script on Chrome/Chromium OS.

    Also, on newer versions of Chromium OS, graphical Python applications (made with Tkinter, PyQt, etc.) don't run because they don't recognise the system DISPLAY environment variable. The problem is that the entire graphical display of Chrome/Chromium OS is controlled by the Google Chrome web browser program and the web browser runs with no DISPLAY variable, meaning that any GUI program started in the OS by the user (meaning that it would be started by the Chrome browser) would start with no DISPLAY variable.

    The workaround is to set the DISPLAY variable for the Chrome browser. To do this, you will need to login as root with the command sudo su, as Crosh does not allow editing the file you will need to edit, even with the sudo command. After logging in as root with sudo su, you will need to run the following commands:

    mount -o remount,rw /dev/root /
    echo "DISPLAY=:0" >> /etc/chrome_dev.conf
    

    Then reboot, and now you should be able to run graphical Python programs as well as console Python programs.