我尝试将 python subprocess.Popen 进程配置为我构建的 snap 包。
为了了解snap包的创建,我决定为一个 markdown 编辑器构建一个 snap 容器,它内置在 python 中,我经常使用。我设法创建了一个 snapcraft.yaml 文件,我可以成功地安装和启动编辑器。
然而,编辑器允许用户打开第二个窗口,例如编辑第二个文件。它在内部调用subprocess.Popen(sys.argv[0])
,因此它创建了自己的子进程。
我未能将这个新过程限制在快照本身。
parent 和 child 上的 argv0 都设置为/snap/remarkable-deadolus/x34/bin/remarkable
,我通过创建一些调试输出进行了验证。
新进程找不到一些库,这些库显然是被主进程成功找到的(因为 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'
在调查时,我发现一些(环境)变量在主快照进程及其子进程的创建之间似乎有所不同。对父级中的调用print(sys.prefix)
产生/snap/remarkable-deadolus/x33/usr
. 然而它在孩子身上产生/usr
。
所以我的问题是如何将 python snap 程序的子进程限制在 snap 包中?
这是我到目前为止的进展:Deadolus Github Remarkable with snapcraft.yaml file
作为参考,我构建然后运行 snap 包的命令是:
snapcraft --debug
sudo snap install --devmode *.snap
remarkable-deadolus
在 snapcraft.yaml 文件中,我通过添加启用了严格限制
confinement: strict