Confine python popen дочерний контейнер привязки - PullRequest
1 голос
/ 30 октября 2019

Я пытаюсь связать подпроцесс python.Popen с пакетом Snap, который я создал.

Чтобы узнать о создании пакета snap , я решил создать контейнер snap для редактора уценок, встроенного в python, которым я регулярно пользуюсь. Мне удалось создать файл 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 к пакету привязки?

Вот мой прогресс: DeadolusGithub Замечательно с файлом snapcraft.yaml

Для справки, мои команды для сборки и запуска пакета snap:

snapcraft --debug
sudo snap install --devmode *.snap
remarkable-deadolus

В файле snapcraft.yaml я включил строгое заключениедобавив

confinement: strict

1 Ответ

1 голос
/ 01 ноября 2019

Файл bin/remarkable в вашем репозитории git начинается с:

#! /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]])
...