Confine python popen child 快照容器

Confine python popen child snap container

我尝试将 python subprocess.Popen 进程分配给我构建的 snap 包。

为了了解 snap 包的创建,我决定为我经常使用的内置 python 的降价编辑器构建一个 snap 容器。 我设法创建了一个 snapcraft.yaml 文件,我可以成功安装并启动编辑器。

但是,编辑器允许用户打开第二个 window,例如编辑第二个文件。 它在内部调用 subprocess.Popen(sys.argv[0]),因此它自己创建了一个 child 进程。
我未能将这个新过程限制在 snap 本身。
parent 和 child 上的 argv0 都设置为 /snap/remarkable-deadolus/x34/bin/remarkable,我通过创建一些调试输出验证了这一点。

新进程无法找到一些库,其中 apparently 被主进程成功找到(因为 snap 包安装了它们):

Traceback (most recent call last):
  File "/snap/remarkable-deadolus/x34/bin/remarkable", line 72, in <module>
    import remarkable
  File "/snap/remarkable-deadolus/x34/remarkable/__init__.py", line 26, in <module>
    import gi
ModuleNotFoundError: No module named 'gi'

在调查时我发现一些(环境)变量似乎在创建主 snap 进程和它的 children 之间有所不同。 在 parent 中调用 print(sys.prefix) 会产生 /snap/remarkable-deadolus/x33/usr。 然而在 child 中它产生 /usr

所以我的问题是 如何将 python snap 程序的 child 进程限制在 snap 包中?

这是我目前的进度:Deadolus Github Remarkable with snapcraft.yaml file

作为参考,我构建然后 运行 快照包的命令是:

snapcraft --debug
sudo snap install --devmode *.snap
remarkable-deadolus

在 snapcraft.yaml 文件中,我通过添加

启用了严格限制
confinement: strict

您的 git 存储库中的 bin/remarkable 文件开头为:

#! /usr/bin/python3

但是 snapcraft.yaml 文件显示它是通过您的 snap 中附带的 Python 解释器调用的:

apps:
  remarkable-deadolus:
    command: usr/bin/python3 $SNAP/bin/remarkable

两个解释器的导入路径不同,所以父子进程可以看到不同的Python组模块。

一种解决方案是更改启动子进程的方式。 sys.executable 变量保存当前 运行 Python 解释器的路径,因此您可以尝试将 Popen 调用更改为:

subprocess.Popen([sys.executable, sys.argv[0]])