QProcess CLI 命令 - 指定输出保存位置时出现“错误参数”

Posted

技术标签:

【中文标题】QProcess CLI 命令 - 指定输出保存位置时出现“错误参数”【英文标题】:QProcess CLI Command - 'Bad parameter' when specifying output save location 【发布时间】:2020-08-07 07:33:10 【问题描述】:

我正在使用 QProcess 运行典型的 cli 命令,例如“ping”或“netstat”。我希望它连续运行,直到我告诉它停止。我在下面提供了使用“ping”命令的代码的精简版本。如果我从 cmd 提示符运行命令“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_()) 

有没有办法将通过 QProcess 运行的 cli 命令的输出保存到文本文件中?

注意:我尝试使用 subprocess.call('ping -t 192.168.0.1 > test.txt', shell=True) 实现相同的功能,但后来遇到了无法停止 ping 的问题。我可以阻止它的唯一方法是在运行我的 PyQt5 程序的 cli 中使用 exit 命令(关闭应用程序只是让文本文件继续更新),这对于带有 GUI 的程序来说并不理想.如果有人对此有解决方案,那么也许我可以回到它。

【问题讨论】:

【参考方案1】:

使用QProcesssetStandardOutputFile方法将处理结果保存到文件中。

【讨论】:

我想一定有一个简单的解决方案。在调用该过程之前添加行:self.process.setStandardOutputFile(os.path.join(origin, 'test.txt')) 就像一个魅力。它确实会导致输出排除“ping”命令在命令以“exit”或“ctrl-C”(最大 ping、平均值、数据包数等)停止时通常会打印出来的正常统计信息。我不需要这些统计信息,但这是否表明它没有正确停止?这是个问题吗? 看不懂你的意思,QProcess像命令行一样工作,你得到的消息是正常的,你可以过滤消息。 这没什么大不了的,我认为它完全按照我的需要工作,我只是想知道为什么当我在命令行中输入"ping -t 192.168.0.1" 然后按 Ctrl+C 它输出: 192.168.0.1 的 Ping 统计信息:数据包:发送 = 5,接收 = 5,丢失 = 0(0% 丢失),以毫秒为单位的近似往返时间:最小值 = 0 毫秒,最大值 = 8 毫秒,平均值 = 2 毫秒 但是,当我终止 QProcess 时,它只会在它发送的最后一个数据包上停止,并且不会像在命令行中那样显示统计信息。就像我之前说的,我不需要统计数据,我只是担心这个过程没有完全完成,只是“暂停”了。无论如何,我很感激你指出我正确的方向。谢谢! @Oliblish 也许您需要将 ctrl+c char 发送到 QProgress 以显示统计信息,但我从未尝试过这样做。终止 Qprocess 只需停止它,不同的是发送 ctrl+c char。

以上是关于QProcess CLI 命令 - 指定输出保存位置时出现“错误参数”的主要内容,如果未能解决你的问题,请参考以下文章

使用 QProcess 时无法读取命令的输出

如何在 PySide 中获取 QProcess 运行的命令的输出?

Qt QProcess

在另一个窗口中显示 QProcess 输出

closeWriteChannel之后的QProcess输出

调用一个系统命令,并读取它的输出值(使用QProcess.readAll)