Команда QProcess CLI - 'Плохой параметр' при указании места сохранения вывода - PullRequest
0 голосов
/ 07 августа 2020

Я использую QProcess для запуска типичной команды cli, такой как 'ping' или 'netstat'. Я бы хотел, чтобы он работал непрерывно, пока я не прикажу ему остановиться. Ниже я предоставил урезанную версию своего кода, в котором используется команда «ping». Если я запускаю команду «ping -t 192.168.0.1> test.txt» из командной строки, она работает нормально, но когда я пытаюсь запустить ее в своей программе ниже, появляется ошибка «Плохой параметр> test.txt».

Похоже, что сохранение вывода команд cli не считается распознанным аргументом / параметром для QProcess (остальная часть кода работает нормально, насколько я могу судить).

from PyQt5 import QtCore, QtGui, QtWidgets
import os
import psutil

## Define origin path.
scriptpath = os.path.realpath(__file__)
scriptpath = scriptpath.replace(os.path.basename(__file__), "")
os.chdir(scriptpath)
origin = os.getcwd()

## Establish UI and interactions.
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        # event actions
        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        lay = QtWidgets.QVBoxLayout(central_widget)

        process_btn = QtWidgets.QPushButton("process")
        process_btn.clicked.connect(self.process)

        end_btn = QtWidgets.QPushButton("end")
        end_btn.clicked.connect(self.end)

        lay.addWidget(process_btn)
        lay.addWidget(end_btn)

        self.process = QtCore.QProcess(self)
        self._pid = -1

    @QtCore.pyqtSlot()
    def process(self):
        program = 'ping'
        arguments = ['-t', '192.168.0.1', '> test.txt'] # Ping 10 times to the router address and save output.
        self.process.setProgram(program)
        self.process.setArguments(arguments)
        ok, pid = self.process.startDetached()
        if ok:
            self._pid = pid

    @QtCore.pyqtSlot()
    def end(self):
        if self._pid > 0:
            p = psutil.Process(self._pid)
            p.terminate()
            self._pid = -1

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_()) 

Есть ли способ сохранить вывод команд cli, выполняемых через QProcess, в текстовый файл?

Примечание: я пытался реализовать ту же функцию с subprocess.call('ping -t 192.168.0.1 > test.txt', shell=True), но затем у меня возникли проблемы с возможностью остановить пинг. Единственный способ остановить это - использовать команду exit в cli, откуда была запущена моя программа PyQt5 (при закрытии приложения текстовый файл продолжал обновляться), что не идеально для программы с GUI. Если у кого-нибудь есть решение этой проблемы, возможно, я смогу go вернуться к нему.

1 Ответ

1 голос
/ 07 августа 2020

Используйте метод QProcess setStandardOutputFile, чтобы сохранить результат процесса в файл.

...