我尝试将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
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]])