【发布时间】:2020-02-25 14:16:03
【问题描述】:
我尝试将 python subprocess.Popen 进程配置为我构建的 snap 包。
为了了解snap 包的创建,我决定为 Markdown 编辑器构建一个 snap 容器,它内置在 python 中,我经常使用。 我设法创建了一个 snapcraft.yaml 文件,我可以成功地安装和启动编辑器。
但是,编辑器允许用户打开第二个窗口,例如编辑第二个文件。
它在内部调用subprocess.Popen(sys.argv[0]),因此它自己创建了一个子进程。
我未能将这个新过程限制在快照本身。
父子节点上的 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
【问题讨论】:
标签: python popen haskell-snap-framework snapcraft