Дамп текущего python файла модуля - PullRequest
0 голосов
/ 16 марта 2020

Фон

У меня есть файл python, который необходимо вызвать изнутри самого себя с помощью nohub (файл является частью структуры средства обновления программного обеспечения, и это используется для перезапустите средство обновления таким образом, чтобы оно не отключалось * ie, когда родительский процесс (программное обеспечение, подлежащее обновлению) умирает как часть процесса обновления).

Это выполняется на встроенной платформе, поэтому нет никакой другой инфраструктуры, на которую я мог бы положиться, чтобы выполнить задачу.

Первая идея состояла в том, чтобы сделать это подобно этому:

subprocess.Popen(['nohup', 'python3', os.path.realpath(__file__), os.path.realpath(tarpath)],
                 stdout=open('/dev/null', 'w'),
                 stderr=open('/dev/null', 'w'),
                 preexec_fn=os.setpgrp
             )

Это работало отлично для другой платформы, над которой я работал , но на текущей платформе все приложение (включая скрипт обновления) упаковано в .pyz архив с файлами внутри архива, скомпилированными в .pyo файлы.

Это разрушает мою предыдущую попытку, так как я не могу напрямую вызвать файл из архива .pyz.

Так что я решил, что могу вывести исходный код во временный каталог (используя inspect.getsource(sys.modules[__name__])) и затем вызвать его, но это работает только в том случае, если у меня есть файл .py, а не файл .pyo.

Единственный способ, который я до сих пор выяснил, как это сделать, - это проанализировать путь к файлу (который я получил, используя inspect.getfile()) и пройтись по всем архивам по пути. Это было бы возможно, но кажется ужасно утомительным для того, что я хочу сделать.

Вопрос

Как я могу вывести файл .pyo, который выполняется из .pyz архив, если все, что у меня есть, это модуль, загруженный в python?

Результат не должен быть читаемым исходным файлом, он просто должен быть исполняемым (как в python path/to/the/file.py необходимо запустить файл ).

...