在 Cloudready/Chromium/Chrome OS 上安装 Python 3 而不安装 Linux containers/environments

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

最近我在 VirtualBox 6.1 上安装了 Neverware 的 Chromium OS 版本,称为 Cloudready,用于为 Chromebook 开发 Python 应用程序。此版本的 Chromium OS 是 48.0.2564.116 开发人员版本(由于图形不兼容,无法安装较新版本)。因为我没有 Google 帐户,所以我以访客用户身份登录 Chromium OS(我以访客身份拥有管理权限,这对我的开发目的很有帮助)。

我发现预装了 Python 2.7.3。我尝试安装 Python 3.6,为此,我尝试找到预安装的包管理器,最终找到了。预装的包管理器 (portage) 没有安装任何东西,因为它给出了类似于这个的错误:

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 / $

我尝试从 here 提供的 get-pip.py 脚本为 Python 2 安装 Python PIP,它成功了。因为我想为我的 Chromebook 程序创建图形界面,所以我想安装 tkinter 模块,因为我不希望我的程序的用户必须使用终端来执行我的 Python 程序并安装 Python 模块,我想安装 PyInstaller。我想通过 PIP 安装 PyInstaller,但 PIP 对任何尝试的模块安装都会抛出以下错误:

/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,

尝试安装 PyInstaller 时,PIP 实际上设法收集了 pyinstaller-4.0.tar.gz 包,但安装失败,因为 PyInstaller 安装程序引发 exception/error BackendUnavailable,然后 PIP 引发再次出现 InsecurePlatformWarning 错误。正如@BryanOakley 所指出的,我无法从 PIP 安装 Tkinter,我在使用 Chromium OS 时忘记了这一点(例如,在 Ubuntu 上安装 Tkinter 的命令是 sudo apt-get install python3-tk),这让事情变得更加棘手。

从出现的错误看来,我必须安装更新版本的 Python(我已经尝试过,但无济于事)。我尝试通过安装 Anaconda 3 然后安装 Miniconda 3 来安装 Python 3,但两者都提供相同的错误,我什至查看了 Stack Overflow 以及人们投票认为 仍然无效的内容为了我。以下命令...

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

...最终导致此输出:

/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

到目前为止没有任何效果。如何在Chromium OS Version 48上用Tkinter和PyInstaller成功安装Python 3.6而不安装Linux containers/environments(比如安装官方Linux的选项(测试版)或 Crouton)或从 Google Play 商店安装任何东西?

有两种可能:

1). python3.6 已经安装。

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

要检查,请尝试:

which python3 或者干脆尝试 运行 python3.

2).卸载 python2 这样甚至不需要合并也可以帮助您。

是正确的,/tmp 挂载为 noexec(没有可执行权限挂载)。不幸的是,他们建议的修复方法(指定不同的 TMPDIR 安装目录)对我不起作用。但是,我最终设法找到了不同的方法。

因此,重新启动 Chrome本书并进入开发者模式。打开 Crosh (Chrome Developer Shell) 然后输入命令 shell 访问隐藏的 Bash shell(因为我使用的是 Chromium OS 开发人员构建,而不是 Chrome OS,我不需要输入开发人员模式访问 Bash shell).

现在,不要像我之前引用的答案中建议的那样指定不同的 TMPDIR 目录,而是将 tmp 重新挂载为 exec(具有可执行权限):

sudo mount /tmp -o remount,exec

当提示输入密码时,输入用户 chronos 的密码。 chronos 有(显然)几个不同的默认密码,包括 facepunchpasswordchromelocalhosttest0000 和一个空白密码(无)。在我的例子中是 chrome。如果您使用的是官方 Chrome 书籍并且已启动进入开发者模式,则您应该在启用开发者模式时使用 chromeos-setdevpasswd 设置密码(有关更多信息,请单击 here)。

之后,从 Conda website 下载 Linux 的 Miniconda 安装脚本(记得下载 64 位版本),将工作目录更改为下载的 Miniconda 安装位置脚本文件,运行 它,并将安装位置更改为具有写入权限的位置(在我的例子中 /usr/local/conda3)。

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

安装完成后,您必须将 Conda 安装添加到 PATH:

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

重启Crosh,再次进入Bashshell。验证已安装的 Conda 二进制文件的目录是否在带有 echo $PATH 的 PATH 中,如果 /usr/local/conda3/bin 在 PATH 中,请验证 Python 是否已安装 python3 --version.

现在是时候安装其他模块了。 Miniconda 的安装包括专门安装 Python 包的包管理器 Conda(但是,Conda 中还有一些其他可用的包,例如 GCC)。使用 Conda,您可以安装 Tkinter、PyInstaller 和许多其他 Python 软件包:

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

安装 PyInstaller 有效,但在 Chromium OS 上似乎没有 objcopy 这样的工具,这意味着 PyInstaller 无法编译任何 Python 脚本,并且如前所述在 PyInstaller 要求中,必须安装 lddobjcopyobjdump,PyInstaller 才能在 Linux 安装上运行。解决方法是在另一台 Linux 计算机上使用 PyInstaller 编译 Python 脚本,然后 运行 在 Chrome/Chromium OS.

上编译脚本

此外,在较新版本的 Chromium OS 上,图形 Python 应用程序(使用 Tkinter、PyQt 等制作)不会 运行,因为它们无法识别系统显示环境变量。问题是 Chrome/Chromium OS 的整个图形显示由 Google Chrome 网络浏览器程序和没有 DISPLAY 变量的网络浏览器 运行 控制,这意味着用户在 OS 中启动的任何 GUI 程序(意味着它将由 Chrome 浏览器启动)将在没有 DISPLAY 变量的情况下启动。

解决方法是为 Chrome 浏览器设置 DISPLAY 变量。为此,您需要使用命令 sudo su 以 root 身份登录,因为 Crosh 不允许编辑您需要编辑的文件,即使使用 sudo 命令也是如此。使用 sudo su 以 root 身份登录后,您将需要 运行 以下命令:

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

然后重新启动,现在您应该可以 运行 图形 Python 程序以及控制台 Python 程序。