Фон
У меня есть файл 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
необходимо запустить файл ).