【问题标题】:Confine python popen child snap container限制 python popen 子快照容器
【发布时间】: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


    【解决方案1】:

    您的 git 存储库中的 bin/remarkable 文件以:

    #! /usr/bin/python3
    

    snapcraft.yaml 文件显示它是使用您的 snap 中附带的 Python 解释器调用的:

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

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

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

    subprocess.Popen([sys.executable, sys.argv[0]])
    

    【讨论】:

    • 通过 sys.executable 添加可执行路径解决了问题 - 非常感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多