Python порождает дочерний подпроцесс, отсоединяется и завершает работу.
Используйте параметр start_new_session, доступный начиная с Python 3.2: [...]
Это позволит родительскому процессу выйти, пока дочерний процесс продолжает работать. [...]
Параметр start_new_session поддерживается во всех системах POSIX, т. е. Linux, MacOS и т. д. [...]
Начиная с Python 3.7, вы можете использовать очень простой флаг DETACH_PROCESS. Этот флаг специфичен для Windows!
Итак, для Linux я должен использовать start_new_session=True, а для Windows я должен использовать Creationflags=subprocess.DETACHED_PROCESS в качестве аргументов для subprocess.Popen
Однако рассмотрим этот пример PyQt5, назовем его detach.py, который я пытаюсь запустить в Ubuntu 22.04 Linux:
Код: Выделить всё
import sys
import subprocess
import time
from PyQt5.QtWidgets import (
QApplication, QMainWindow, QTextEdit,
QAction, QMessageBox
)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("My New App")
self.text = QTextEdit()
self.setCentralWidget(self.text)
self._create_menu()
def _create_menu(self):
file_menu = self.menuBar().addMenu("&File")
rundetach_action = QAction("Run detached", self)
rundetach_action.triggered.connect(self.run_detached_cmd)
file_menu.addAction(rundetach_action)
exit_action = QAction("Exit", self)
exit_action.triggered.connect(self.close)
file_menu.addAction(exit_action)
def run_detached_cmd(self):
pkexec_cmd = ['pkexec', 'bash', '-c', 'echo "Done on $(date)" >> /tmp/log.txt']
subprocess.Popen(
pkexec_cmd,
start_new_session=True,
close_fds=True
)
time.sleep(2)
sys.exit(0)
def main():
app = QApplication(sys.argv)
win = MainWindow()
win.resize(600, 400)
win.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
Итак, почему start_new_session=True не работает в этом случае - и как я могу заставить его работать (точнее, как я могу запустить команду pkexec из отключенного Python, чтобы диалоговое окно pkexec сохранялось даже когда родительское приложение PyQt5 detach.py завершилось)?
Подробнее здесь: https://stackoverflow.com/questions/798 ... -pyqt5-app
Мобильная версия