Я использую 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 вернуться к нему.