1

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

1 回答 1

1

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]])
于 2019-11-01T06:09:05.287 回答