Confine python popen child snap container

问题描述 投票:1回答:1

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

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

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

新进程无法找到某些库,这些库显然是由主进程成功找到的(因为快照程序包已安装它们):

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'

[调查时,我发现在主快照过程的创建与其子过程之间,某些(环境)变量似乎有所不同。父级中对print(sys.prefix)的调用将产生/snap/remarkable-deadolus/x33/usr。然而,在孩子中,它产生/usr

所以我的问题是我如何将python snap程序的子进程限制为snap包?

到目前为止,我的进展是:Deadolus Github Remarkable with snapcraft.yaml file

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

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

在snapcraft.yaml文件中,我通过添加启用严格限制

confinement: strict
python popen haskell-snap-framework snapcraft
1个回答
0
投票

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

#! /usr/bin/python3

但是snapcraft.yaml文件显示它是由快照中附带的Python解释器调用的:

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

这两个解释器具有不同的导入路径,因此父进程和子进程可以看到不同的Python模块集。

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

subprocess.Popen([sys.executable, sys.argv[0]])
© www.soinside.com 2019 - 2024. All rights reserved.