Start_new_session в subprocess.Popen не отсоединяет процесс в приложении PyQt5?Python

Программы на Python
Ответить
Anonymous
 Start_new_session в subprocess.Popen не отсоединяет процесс в приложении PyQt5?

Сообщение Anonymous »

На данный момент я видел:
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()
Итак, если я запущу это как python3 detach.py, а затем выберу Файл/"Выполнить отсоединенный", появится диалоговое окно pkexec, но затем оно будет автоматически закрыто по истечении времени сна time.sleep(2), и приложение с графическим интерфейсом будет завершено. Если команда time.sleep(2) закомментирована, диалоговое окно pkexec вообще не отображается. Другими словами, это означает, что даже если я использую start_new_session=True, процесс, который я хочу запустить отдельно, не запускается отдельно.
Итак, почему start_new_session=True не работает в этом случае - и как я могу заставить его работать (точнее, как я могу запустить команду pkexec из отключенного Python, чтобы диалоговое окно pkexec сохранялось даже когда родительское приложение PyQt5 detach.py завершилось)?

Подробнее здесь: https://stackoverflow.com/questions/798 ... -pyqt5-app
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»