class QProcess#

用于启动外部程序并与它们通信的 QProcess 类。更多...

Inheritance diagram of PySide6.QtCore.QProcess

概要#

方法#

插槽#

信号#

静态函数#

注意

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,也可以通过在https:/bugreports.qt.io/projects/PYSIDE上创建票证来告知我们。

详细描述#

警告

本节包含自动从C++翻译到Python的代码片段,可能包含错误。

运行进程#

要启动一个进程,将您想要运行的程序的名称和命令行参数作为 start() 方法 的参数传入。参数作为单独的字符串在 QStringList 中提供。

或者,您可以使用 setProgram()setArguments() 方法设置程序运行环境,然后调用 start()open()

例如,以下代码片段通过将“-style”和“fusion”作为列表中的两项字符串传入,在X11平台上运行融合风格的模拟时钟示例。

parent = QObject()            ...

program = "./path/to/Qt/examples/widgets/analogclock"
arguments = QStringList()
arguments << "-style" << "fusion"
myProcess = QProcess(parent)
myProcess.start(program, arguments)

QProcess 然后进入 Starting 状态,当程序启动时,QProcess 进入 Running 状态并发出 started() 信号。

QProcess 允许您将进程作为顺序输入/输出设备处理。您可以像使用 QTcpSocket 访问网络连接一样写入和读取进程。您可以调用 write() 将数据写入进程的标准输入,通过调用 read()readLine()getChar() 读取标准输出。因为 QIODevice 的继承,QProcess 也可以用作 QXmlReader 的输入源,或者用于使用 QNetworkAccessManager 上传数据。

当进程退出时,QProcess 会重新进入 NotRunning 状态(初始状态),并发出 finished() 信号。

finished() 信号提供了进程的退出代码和退出状态作为参数,您还可以调用 exitCode() 来获取最后一个完成进程的退出代码,并调用 exitStatus() 来获取其退出状态。如果在任何时刻发生错误,QProcess 将发出 errorOccurred() 信号。您还可以调用 error() 来查找上次发生的错误类型,并调用 state() 来查找当前进程状态。

注意

QProcess 不支持 VxWorks、iOS、tvOS 或 watchOS。

查找可执行文件#

要运行的程序可以通过调用 setProgram() 或直接在 start() 调用中设置。使用程序名称和参数调用 start() 的效果与先调用 setProgram()setArguments(),然后调用不带这些参数的重载函数相同。

QProcess 会以三种不同的方式之一解析程序名称,类似于 Unix shell 和 Windows 命令解释器在自己的命令行中操作的方式。

  • 如果程序名称是绝对路径,则将启动该确切的可执行文件,且 QProcess 不进行搜索。

  • 如果程序名称是包含多个路径组件(即至少包含一个斜杠)的相对路径,则搜索该相对路径的起始目录依赖于操作系统:在Windows上,它是父进程的当前工作目录;而在Unix上,则是通过 setWorkingDirectory() 设置的那个目录。

  • 如果程序名称是一个没有斜杠的普通文件名,其行为依赖于操作系统。在Unix系统上,QProcess 将搜索 PATH 环境变量;在Windows上,由操作系统进行搜索,并首先搜索父进程的当前目录,然后在 PATH 环境变量之前(有关完整列表,请参阅 CreateProcess 文档)。

为了避免平台相关的行为或与应用程序启动方式相关的问题,建议始终传递启动可执行文件时的绝对路径。对于与应用程序一起分发的辅助二进制文件,可以以 applicationDirPath() 开始构建这样一个路径。同样,要显式运行位于 setWorkingDirectory() 设置的目录中的可执行文件,请使用以 “./” 或 “../” 开头的程序路径,具体取决于情况。

在Windows上,除了在 CreateProcess 文档中概述的情况外,Most uses do not require the “.exe” suffix。此外,QProcess 将将Unix样式的正斜杠转换为Windows路径的反斜杠,用于程序名称。这允许像上面示例中那样编写跨平台代码。

QProcess 不支持直接执行Unix shell或Windows命令解释器的内置函数,例如 cmd.exedir 命令或Bourne外壳的 export。在Unix上,尽管许多shell内置函数也作为单独的可执行文件提供,但其行为可能与作为内置函数实现的那些不同。要运行这些命令,应显式使用适当的选项执行解释器。对于Unix系统,以两个参数启动 "/bin/sh":"-c" 和要运行的命令行字符串。对于Windows,由于 window的 cmd.exe 非标准方式解析其命令行,请使用 setNativeArguments()(例如,"/c dir d:HAVEzep")。

环境变量#

QProcess API 提供了操作子进程所看到的环境变量的方法。默认情况下,子进程将复制在调用 start() 函数时的当前进程环境变量的副本。这意味着在此调用之前使用 qputenv() 执行的任何修改都将反映在子进程的环境中。请注意,QProcess 不会尝试防止其他线程中发生 qputenv() 竞态条件的尝试,因此建议在应用程序启动后避免使用 qputenv()

可以使用 processEnvironment()setProcessEnvironment() 函数以及 QProcessEnvironment 类来修改特定子进程的环境。默认情况下,processEnvironment() 将返回一个对象,其中 inheritsFromParent() 的结果为 true。设置不继承自父进程的环境将导致 QProcess 在启动子进程时使用确切的此环境。

常规场景是从调用 systemEnvironment() 的当前环境开始,然后继续添加、更改或删除特定变量。然后将结果变量表应用到一个 QProcess,并使用 setProcessEnvironment()

可以通过使用 QProcessEnvironment() 默认构造函数,从空环境开始或将所有变量从环境中移除。除非在受控和系统特定条件下,否则不建议这样做,因为可能存在设置在当前进程环境中的系统变量,这些变量对于子进程的正确执行是必需的。

在 Windows 上,如果未设置,QProcess 将复制当前进程的 "PATH""SystemRoot" 环境变量。无法完全取消设置,但可以将其设置为空值。在 Windows 上将 "PATH" 设置为空很可能会导致子进程无法启动。

通过通道通信

进程有两个预定义的输出通道:标准输出通道(stdout)提供常规控制台输出,标准错误通道(stderr)通常提供进程打印的错误。这些通道代表两个独立的数据流。您可以通过调用 setReadChannel() 在它们之间切换。当当前读取通道上有可用数据时,QProcess 会发出 readyRead() 信号。当有新的标准输出数据可用时,会发出 readyReadStandardOutput() 信号;当有新的标准错误数据可用时,会发出 readyReadStandardError() 信号。您可以通过调用 read()readLine()getChar() 读取数据,也可以显式通过调用 readAllStandardOutput()readAllStandardError() 从两个通道中的任一通道读取所有数据。

通道的术语可能会令人误解。请注意,进程的输出通道对应于 QProcessread 通道,而进程的输入通道对应于 QProcesswrite 通道。这是因为我们用 QProcess 读取的是进程的输出,而我们写入的变成进程的输入。

QProcess 可以合并两个输出通道,这样正在运行的过程的标准输出和标准错误数据都使用标准输出通道。在启动过程之前,调用 setProcessChannelMode()MergedChannels 以激活此功能。您还可以通过将 ForwardedChannels 作为参数传递来将运行过程输出转发到调用,主过程。您还可以只转发输出通道中的一个——通常人们会使用 ForwardedErrorChannel ,但也存在 ForwardedOutputChannel。请注意,使用通道转发在GUI应用程序中通常是一个糟糕的主意——您应该以图形方式呈现错误。

某些过程需要特殊的环境设置才能运行。您可以通过调用 setProcessEnvironment() 为您的过程设置环境变量。要设置工作目录,请调用 setWorkingDirectory() 。默认情况下,过程在调用过程的当前工作目录中运行。

使用 QProcess 启动的GUI应用程序窗口的位置和屏幕Z顺序由底层窗口系统控制。对于Qt 5应用程序,可以使用 -qwindowgeometry 命令行选项来指定位置;X11应用程序通常接受 -geometry 命令行选项。

同步过程API

QProcess 提供了一组函数,使其能够在不需要事件循环的情况下使用,通过挂起调用线程直到某些信号被发射

  • waitForStarted() 阻塞,直到过程已启动。

  • waitForReadyRead() 阻塞,直到在当前读取通道上有新数据可供读取。

  • waitForBytesWritten() 阻塞,直到已将一个数据负载写入过程。

  • waitForFinished() 阻塞,直到过程已完成。

从主线程(调用 QApplication::exec() 的线程)调用这些函数可能会导致您的用户界面冻结。

以下示例在没有事件循环的情况下运行 gzip 以压缩字符串“Qt rocks!”

gzip = QProcess()
gzip.start("gzip", QStringList() << "-c")
if not gzip.waitForStarted():
    return False
gzip.write("Qt rocks!")
gzip.closeWriteChannel()
if not gzip.waitForFinished():
    return False
result = gzip.readAll()

另请参阅

QBuffer QFile QTcpSocket

class ProcessError#

此枚举描述了QProcess 报告的不同类型错误。

常量

描述

QProcess.FailedToStart

进程启动失败。可能是调用的程序缺失,或者您可能没有足够的权限或资源来调用该程序。

QProcess.Crashed

进程在成功启动一段时间后崩溃。

QProcess.Timedout

最后一个 waitFor…() 函数超时。QProcess 的状态未改变,您可以尝试再次调用 waitFor…()。

QProcess.WriteError

尝试写入进程时发生错误。例如,进程可能未运行,或者它可能已关闭其输入通道。

QProcess.ReadError

尝试从进程读取时发生错误。例如,进程可能未运行。

QProcess.UnknownError

发生未知错误。这是error() 的默认返回值。

另请参阅

error()

class ProcessState#

此枚举描述了QProcess 的不同状态。

常量

描述

QProcess.NotRunning

该进程未运行。

QProcess.Starting

该进程正在启动,但程序尚未被调用。

QProcess.Running

该进程正在运行,并准备好进行读取和写入。

另请参阅

state()

class ProcessChannel#

此枚举描述了运行进程使用的进程通道。将这些值之一传递给setReadChannel() 以设置 QProcess 的当前读取通道。

常量

描述

QProcess.StandardOutput

运行进程的标准输出(stdout)。

QProcess.StandardError

运行进程的标准错误(stderr)。

另请参阅

setReadChannel()

class ProcessChannelMode#

这个枚举描述了 QProcess 的进程输出通道模式。将这些值之一传递给 setProcessChannelMode() 函数来设置当前读取通道模式。

常量

描述

QProcess.SeparateChannels

QProcess 管理正在运行的进程的输出,将标准输出和标准错误数据保存在单独的内部缓冲区中。您可以通过调用 setReadChannel() 函数来选择 QProcess 的当前读取通道。这是 QProcess 的默认通道模式。

QProcess.MergedChannels

QProcess 将正在运行的进程的输出合并到标准输出通道(stdout)。标准错误通道(stderr)将不会接收任何数据。正在运行的进程的标准输出和标准错误数据将交错。对于分离的进程,正在运行的进程的合并输出将转发到主进程。

QProcess.ForwardedChannels

QProcess 将正在运行的进程的输出转发到主进程。子进程对其标准输出和标准错误的任何写入都将写入主进程的标准输出和标准错误。

QProcess.ForwardedErrorChannel

QProcess 管理正在运行的进程的标准输出,但将其标准错误转发到主进程。这反映了命令行工具作为筛选器的典型用法,其中标准输出被重定向到另一个进程或文件,而标准错误用于诊断目的输出到控制台。(此值自 Qt 5.2 引入。)

QProcess.ForwardedOutputChannel

ForwardedErrorChannel 的补充。(此值自 Qt 5.2 引入。)

注意

Windows 故意抑制仅 GUI 应用程序的输出到继承的控制台。这 适用于重定向到文件或管道的输出。要在控制台上即使如此转发仅 GUI 应用程序的输出,必须使用 SeparateChannels 并自己通过读取输出并将其写入适当的输出通道来进行转发。

class InputChannelMode#

这个枚举描述了 QProcess 的进程输入通道模式。将这些值之一传递给 setInputChannelMode() 函数来设置当前写入通道模式。

常量

描述

QProcess.ManagedInputChannel

QProcess.ForwardedInputChannel

另请参阅

setInputChannelMode()

常量

描述

QProcess.NormalExit

QProcess.CrashExit

另请参阅

exitStatus()

常量

描述

QProcess.UnixProcessFlag.CloseFileDescriptors

QProcess.UnixProcessFlag.CreateNewSession

QProcess.UnixProcessFlag.DisconnectControllingTerminal

QProcess.UnixProcessFlag.IgnoreSigPipe

总是将SIGPIPE信号设置为忽略(SIG_IGN),即使设置了ResetSignalHandlers标志。默认情况下,如果子进程尝试在其标准输出或标准错误添加后关闭相应的通道(使用closeReadChannel()),则它将收到SIGPIPE信号并立即终止;使用此标志时,写操作失败但没有信号,子进程可能继续执行。

QProcess.UnixProcessFlag.ResetIds

删除当前进程可能仍然保留的任何有效用户或组ID(请参阅setuid(2)setgid(2),以及QCoreApplication::setSetuidAllowed())。如果当前进程设置了setuid或setgid,并且不想让子进程保留提升的权限,则这很有用。

QProcess.UnixProcessFlag.ResetSignalHandlers

将所有Unix信号处理程序重置为其默认状态(即,通过signal(2)SIG_DFL传递给它)。此标志用于确保任何被忽略(SIG_IGN)的信号不会影响子进程的行为。

QProcess.UnixProcessFlag.UseVFork

请求QProcess使用vfork(2)启动子进程。使用此标志来指示与setChildProcessModifier()设置的回调函数在vfork(2)的子进程中是安全的;也就是说,回调不修改任何非局部变量(直接或通过它调用的任何函数),也不尝试与父进程通信。如果QProcess实际上将使用vfork(2),以及如果vfork(2)与标准fork(2)不同,这是由实现定义的。

6.6版本中新引入。

__init__([parent=None])#
参数::

parentQObject

使用给定的parent构造一个QProcess对象。

arguments()#
返回类型::

字符串列表

返回进程最后一次启动时使用的命令行参数。

另请参阅

setArguments() start()

closeReadChannel(channel)#
参数::

channelProcessChannel

关闭读取通道 channel。调用此函数后,QProcess 将不再接收通道上的数据。任何已接收的数据仍可用于读取。

如果您对进程的输出不感兴趣,调用此函数以节省内存。

closeWriteChannel()#

警告

本节包含自动从C++翻译到Python的代码片段,可能包含错误。

安排 QProcess 的写入通道关闭。通道将在所有数据都已写入进程后关闭。调用此函数后,任何尝试写入进程都将失败。

对于需要一直读取输入数据直到通道关闭的程序,关闭写入通道是必要的。例如,"more" 程序在 Unix 和 Windows 的控制台中都用于显示文本数据。但是,它不会显示文本数据,直到 QProcess 的写入通道关闭。示例

more = QProcess()
more.start("more")
more.write("Text to display")
more.closeWriteChannel()
# QProcess will emit readyRead() once "more" starts printing

在调用 start() 时会隐式打开写入通道。

另请参阅

closeReadChannel()

environment()#
返回类型::

字符串列表

返回 QProcess 将传递给子进程的环境,或者在未使用 setEnvironment() 设置环境的情况下,返回一个空的 QStringList。如果未设置环境,将使用调用进程的环境。

error()#
返回类型::

ProcessError

返回上次发生错误的类型。

另请参阅

state()

errorOccurred(error)#
参数::

errorProcessError

指定的 error 描述了发生的错误类型。

静态execute(program[, arguments={}])#
参数::
  • program – str

  • arguments – 字符串列表

返回类型::

int

在新进程中启动程序 program 并使用参数 arguments,等待其完成并返回进程的退出代码。新进程写入控制台的数据会转发到调用进程。

环境和工作目录从调用进程继承。

参数处理与各自的 start() 调用重载相同。

如果无法启动进程,则返回 -2。如果进程崩溃,则返回 -1。否则,返回进程的退出代码。

另请参阅

start()

exitCode()#
返回类型::

int

返回最后一个完成的进程的退出代码。

除非 exitStatus() 返回 NormalExit,否则此值不正确。

exitStatus()#
返回类型::

ExitStatus

返回最后一个完成的进程的退出状态。

在 Windows 上,如果另一个应用程序使用 TerminateProcess() 终止了进程,此函数仍将返回 NormalExit,除非退出代码小于 0。

failChildProcessModifier(description[, error=0])#
参数::
  • description – str

  • error – int

该函数可以与 setChildProcessModifier() 一起使用,在修饰符集中表示遇到了错误条件。当修饰符调用这些函数时,QProcess 将在父进程中触发 errorOccurred() 信号,带有代码 FailedToStartdescription 可以被用来在 errorString() 中包含一些信息以帮助诊断问题,通常是失败的调用名称,类似于 C 库函数 perror() 的行为。此外,error 参数可以是一个 <errno.h> 错误码,其文本形式也会被包含在内。

例如,一个子修饰符可以按照这种方式为子进程准备一个额外的文件描述符

process.setChildProcessModifier([fd, &process]() {
    if (dup2(fd, TargetFileDescriptor) < 0)
        process.failChildProcessModifier(errno, "aux comm channel");
});
process.start();

其中 fd 是在父进程中已打开的文件描述符。如果 dup2() 系统调用导致了 EBADF 条件,进程的 errorString() 可能是:“子进程修饰符报告错误:辅助通信通道:无效文件描述符”。

此函数不会返回调用者。除了在子修饰符中以及使用正确的 QProcess 对象之外使用它是不确定的。

注意

实现强加了一个长度限制到 description 参数的约500个字符。这不包括错误码的文本。

另请参阅

setChildProcessModifier() setUnixProcessParameters()

finished(exitCode[, exitStatus=QProcess.ExitStatus.NormalExit])#
参数::

当进程完成时,将发出此信号。 exitCode 表示进程的退出代码(仅对正常退出有效),而 exitStatus 表示退出状态。进程完成后,QProcess 中的缓冲区仍然保持完好。您仍然可以读取进程在完成前可能写入的任何数据。

另请参阅

exitStatus()

inputChannelMode()#
返回类型::

InputChannelMode

返回 QProcess 标准输入通道的通道模式。

kill()#

终止当前进程,导致其立即退出。

在 Windows 上,kill() 使用 TerminateProcess,而在 Unix 和 macOS 上,会向进程发送 SIGKILL 信号。

另请参阅

terminate()

静态 nullDevice()#
返回类型::

str

操作系统的空设备。

返回的文件路径使用本机目录分隔符。

processChannelMode()#
返回类型::

ProcessChannelMode

返回 QProcess 标准输出和标准错误通道的通道模式。

processEnvironment()#
返回类型::

操作系统版本.QProcessEnvironment

返回 QProcess 将传给其子进程的环境。如果没有使用 setProcessEnvironment() 设置环境,此方法将返回一个表示环境将从父进程继承的对象。

另请参阅

setProcessEnvironment()inheritsFromParent() 环境 变量

processId()#
返回类型::

int

如果可用,返回运行进程的本地进程标识符。如果没有进程当前在运行,则返回 0

program()#
返回类型::

str

返回进程上次启动时使用的程序。

另请参阅

setProgram() start()

readAllStandardError()#
返回类型::

QByteArray

不顾当前的读取通道,此函数将返回进程标准错误的全部可用数据,作为一个 QByteArray

readAllStandardOutput()#
返回类型::

QByteArray

不顾当前的读取通道,此函数将返回进程标准输出的全部可用数据,作为一个 QByteArray

readChannel()#
返回类型::

进程通道

返回 QProcess 的当前读取通道。

另请参阅

setReadChannel()

readyReadStandardError()#

当进程通过其标准错误通道(stderr)提供新数据时,将发出此信号。它会发出,而不论当前的 read channel 是什么。

readyReadStandardOutput()#

当进程通过其标准输出通道(stdout)提供新数据时,将发出此信号。它会发出,而不论当前的 read channel 是什么。

setArguments(arguments)#
参数::

arguments – 字符串列表

设置启动进程时要传递给调用程序的参数。此函数必须在调用 start() 之前调用。

setEnvironment(environment)#
参数::

环境 – 字符串列表

警告

本节包含自动从C++翻译到Python的代码片段,可能包含错误。

设置将传递给子进程的环境,其中 QProcess 将通过的环境变量列表。参数 environment 是键值对的列表。

例如,以下代码添加了环境变量 TMPDIR

process = QProcess()
env = QProcess.systemEnvironment()
env << "TMPDIR=C:\\MyApp\\temp" # Add an environment variable
process.setEnvironment(env)
process.start("myapp")

注意

此函数比 setProcessEnvironment() 函数效率低。

setInputChannelMode(mode)#
参数::

modeInputChannelMode

QProcess 标准输入通道的通道模式设置为指定的 mode。在下次调用 start() 时将使用此模式。

setProcessChannelMode(mode)#
参数::

modeProcessChannelMode

警告

本节包含自动从C++翻译到Python的代码片段,可能包含错误。

QProcess 的标准输出和标准错误通道的通道模式设置为指定的 mode。在下次调用 start() 时将使用此模式。例如

builder = QProcess()
builder.setProcessChannelMode(QProcess.MergedChannels)
builder.start("make", QStringList() << "-j2")
if not builder.waitForFinished():
    print("Make failed:", builder.errorString())
else:
    print("Make output:", builder.readAll())
setProcessEnvironment(environment)#
参数::

环境QProcessEnvironment

警告

本节包含自动从C++翻译到Python的代码片段,可能包含错误。

设置将要传递给子进程的 环境

例如,以下代码添加了环境变量 TMPDIR

process = QProcess()
env = QProcessEnvironment.systemEnvironment()
env.insert("TMPDIR", "C:\\MyApp\\temp") # Add an environment variable
process.setProcessEnvironment(env)
process.start("myapp")

注意,在 Windows 中,环境变量名称不区分大小写。

另请参阅

processEnvironment() systemEnvironment() 环境变量

setProcessState(state)#
参数::

状态 - ProcessState

QProcess 的当前状态设置为指定的 状态

另请参阅

state()

setProgram(program)#
参数::

program – str

设置启动进程时要使用的 程序。此函数必须在 start() 调用之前调用。

如果 program 是一个绝对路径,则它指定要启动的确切可执行文件。相对路径将以平台特定的方式解析,包括搜索 PATH 环境变量(有关详细信息,请参阅 查找可执行文件)。

setReadChannel(channel)#
参数::

channelProcessChannel

将当前读写通道的 QProcess 设置为指定的 channel。当前输入通道被下面这些函数使用: read()readAll()readLine() ,以及 getChar()。它还决定了哪个通道触发 QProcess 发射 readyRead() 事件。

另请参阅

readChannel()

setStandardErrorFile(fileName[, mode=QIODeviceBase.OpenModeFlag.Truncate])#
参数::

将进程的标准错误重定向到名为 fileName 的文件。当重定向生效后,标准错误读通道将被关闭:使用 read() 读取将始终失败,同样 readAllStandardError() 也会失败。如果 mode 是追加模式,文件将会被追加到,否则将会被截断。

有关文件打开方式的更多信息,请参阅 setStandardOutputFile()

注意:如果使用 setProcessChannelMode() 函数并传入参数为 MergedChannels,则此函数没有任何效果。

setStandardInputFile(fileName)#
参数::

fileName – 字符串

将进程的标准输入重定向到由 fileName 指定的文件。当存在输入重定向时,QProcess 对象将处于只读模式(调用 write() 将导致错误)。

要使进程立即读取 EOF,请在此处传入 nullDevice()。这比在写入任何数据之前使用 closeWriteChannel() 更干净,因为它可以在启动进程之前设置。

如果:fileName 文件在调用 start() 时不存在或不可读,启动进程将失败。

进程启动后调用 setStandardInputFile() 无效。

setStandardOutputFile(fileName[, mode=QIODeviceBase.OpenModeFlag.Truncate])#
参数::

将进程的标准输出重定向到文件 fileName。当重定向设置时,标准输出读取通道关闭:使用 read() 读取它将始终失败,同样适用 readAllStandardOutput()

要丢弃进程的所有标准输出,请在此处传入 nullDevice()。这比简单地不读取标准输出更有效率,因为没有填充任何 QProcess 缓冲区。

如果在调用 start() 时文件 fileName 不存在,它将被创建。如果无法创建,启动将失败。

如果文件存在且 mode 是 QIODevice::Truncate,则文件将被截断。否则(如果 mode 是 QIODevice::Append),则将文件追加到。

进程启动后调用 setStandardOutputFile() 无效。

如果fileName是一个空字符串,它将停止重定向标准输出。这在重定向后恢复标准输出时非常有用。

setStandardOutputProcess(destination)#
参数::

destinationQProcess

警告

本节包含自动从C++翻译到Python的代码片段,可能包含错误。

将此进程的标准输出流管道传输到destination进程的标准输入。

以下shell命令

command1 | command2

可以使用以下代码与QProcess实现

process1 = QProcess()
process2 = QProcess()
process1.setStandardOutputProcess(process2)
process1.start("command1")
process2.start("command2")
setUnixProcessParameters(flagsOnly)#
参数::

flagsOnly – 组合 UnixProcessFlag

这是一个重载函数。

为Unix系统中的子进程设置额外的flagsOnly设置。这等同于只需设置flags字段的重载。

注意

此函数仅在Unix平台上可用。

另请参阅

unixProcessParameters()

setUnixProcessParameters(params)
参数::

paramsUnixProcessParameters

为Unix系统中的子进程设置额外的设置和参数为params。此函数可以用来在启动目标可执行文件之前请求QProcess修改子进程。

此函数可以用来更改子进程的某些属性,例如关闭所有无关的文件描述符、更改子进程的优先级或从控制TTY断开连接。为了更精细地控制子进程或以其他方式对其进行修改,请使用setChildProcessModifier()函数。如果同时设置了子进程修改器和Unix进程参数,则会在应用这些参数之前运行修改器。

注意

此函数仅在Unix平台上可用。

另请参阅

unixProcessParameters()

setWorkingDirectory(dir)#
参数::

dir – 字符串

将工作目录设置为 dir。在 QProcess 中,进程将在该目录下启动。默认行为是在调用进程的工作目录中启动进程。

静态 splitCommand(command)#
参数::

command – 字符串

返回类型::

字符串列表

将字符串 command 分割成令牌列表并返回该列表。

带有空格的令牌可以用双引号包围;三个连续的双引号代表引号字符本身。

start(program[, arguments={}[, mode=QIODeviceBase.OpenModeFlag.ReadWrite]])#
参数::
  • program – str

  • arguments – 字符串列表

  • modeOpenModeFlag 的组合

在新的进程中启动给定的 program,通过在 arguments 中传递命令行参数。有关 QProcess 如何搜索要运行的执行文件的信息,请参阅 setProgram()。OpenMode 设置为 mode。不进一步拆分参数。

PySide6.QtCore.QProcess 对象将立即进入启动状态。如果进程启动成功,则会发出 started() 信号;否则将发出 errorOccurred() 信号。请注意,在能够同步启动子进程的平台(特别是Windows)上,这些信号将在此函数返回之前发出,此 QProcess 对象将分别过渡到 RunningNotRunning 状态。在其他平台上,started()errorOccurred() 信号将被延迟。

通过调用 waitForStarted() 来确保进程已启动(或启动失败)且已发出这些信号。即使已知道进程的启动状态,调用该函数也是安全的,尽管信号不会再被发出。

Windows: 参数被引号包裹并合并成一个与 Windows 函数 CommandLineToArgvW() 兼容的命令行。对于具有不同命令行引号要求的程序,您需要使用 setNativeArguments() 。一个不遵循 CommandLineToArgvW() 规则的著名程序是 cmd.exe,因此所有批处理脚本也不例外。

如果 QProcess 对象已经运行一个进程,则在控制台可能会打印出警告信息,而现有的进程将继续运行不受影响。

注意

启动子进程成功仅意味着操作系统已成功创建进程并为其分配了每个进程都有的资源,例如进程ID。子进程可能非常早期就崩溃或失败,因此不会产生预期的输出。在大多数操作系统中,这可能包括动态链接错误。

另请参阅

processId() started() waitForStarted() setNativeArguments()

start([mode=QIODeviceBase.OpenModeFlag.ReadWrite])
参数::

modeOpenModeFlag 的组合

这是一个重载函数。

启动由 setProgram() 设置的程序,使用 setArguments() 设置的参数。OpenMode 设置为 mode

另请参阅

open() setProgram() setArguments()

startCommand(command[, mode=QIODeviceBase.OpenModeFlag.ReadWrite])#
参数::

警告

本节包含自动从C++翻译到Python的代码片段,可能包含错误。

在一个新的进程中启动命令 command。OpenMode 设置为 mode

command 是包含程序名称及其参数的单个文本字符串。参数由一个或多个空格分隔。例如

process = QProcess()
process.startCommand("del /s *.txt")
# same as process.start("del", QStringList() << "/s" << "*.txt")
...

包含空格的参数必须用引号引起来,才能正确地提供给新进程。例如

process = QProcess()
process.startCommand("dir \"My Documents\"")

command 字符串中的字面引号表示为三重引号。例如

process = QProcess()
process.startCommand("dir \"Epic 12\"\"\" Singles\"")

command 字符串被拆分和取消引号后,此函数表现得像 start() 一样。

在操作系统中,系统 API 原生使用单个字符串传递命令行参数给子进程(Windows),可能存在无法通过 QProcess 的可移植基于列表的 API 传递命令行。在这些罕见情况下,您需要使用 setProgram()setNativeArguments() 而不是此函数。

另请参阅

splitCommand() start()

静态startDetached(program[, arguments={}[, workingDirectory=""]])#
参数::
  • program – str

  • arguments – 字符串列表

  • workingDirectory – 字符串

返回类型::

(retval, pid)

此函数重载了 startDetached()

以新进程启动程序 program,并与其解除关联。成功时返回 true;失败时返回 false。如果调用进程退出,解除关联的进程将继续运行而不会受到影响。

参数处理与各自的 start() 调用重载相同。

进程将在目录 workingDirectory 中启动。如果 workingDirectory 为空,工作目录将继承自调用进程。

如果函数成功,则 *``pid`` 将设置为启动进程的进程标识符。

另请参阅

start()

startDetached([pid=None])
参数::

pidqint64

返回类型::

bool

以新进程启动由 setProgram() 设置的程序,以及使用 setArguments() 设置的参数。成功时返回 true;否则返回 false。如果调用进程退出,解除关联的进程将继续运行而不会受到影响。

Unix: 启动的进程将在自己的会话中运行,并像守护进程一样操作。

进程将在由 setWorkingDirectory() 设置的目录中启动。如果 workingDirectory() 为空,工作目录将继承自调用进程。

如果函数成功则 *``pid`` 将设置为启动进程的进程标识符;否则,它将被设置为 -1。请注意,子进程可能会突然退出,并且 PID 可能会变得无效。此外,在子进程退出后,相同的 PID 可能会被回收并用于完全不同的进程。用户代码在使用此变量时应谨慎,特别是如果打算通过操作系统方式强制终止进程。

startDetached() 只支持以下属性设置器:

QProcess 对象的其他所有属性都将被忽略。

注意

被调用进程将继承调用进程的控制台窗口。要抑制控制台输出,请将标准错误输出重定向到 nullDevice()

另请参阅

start() startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory, qint64 *pid)

started()#

此信号由 QProcess 在进程启动时发出,当 state() 返回 运行中 时。

state()#
返回类型::

ProcessState

返回进程的当前状态。

另请参阅

stateChanged() error()

stateChanged(state)#
参数::

状态 - ProcessState

此信号在 QProcess 的状态改变时发出。`newState` 参数是 QProcess 更改到的状态。

static systemEnvironment()#
返回类型::

字符串列表

警告

本节包含自动从C++翻译到Python的代码片段,可能包含错误。

以键值对列表的形式返回调用进程的环境。

environment = QProcess.systemEnvironment()
# environment = {"PATH=/usr/bin:/usr/local/bin",
#                "USER=greg", "HOME=/home/greg"}

此函数不会缓存系统环境,因此如果已经调用了类似 setenvputenv 之类的低级 C 库函数,则可以在更新后获取环境的版本。

但是请注意,重复调用此函数将重新创建环境变量列表,这是一个相当复杂的操作。

注意

对于新代码,建议使用 systemEnvironment()

terminate()#

尝试终止进程。

调用此函数后,进程可能不会退出(它会有机会提示用户保存未保存的文件等)。

在Windows上,terminate()会将WM_CLOSE消息发送到进程的所有顶层窗口,然后发送到进程主线程本身。在Unix和macOS上,将发送SIGTERM信号。

Windows上的控制台应用程序如果没有运行事件循环,或者其事件循环未处理WM_CLOSE消息,则只能通过调用kill()来终止。

另请参阅

kill()

unixProcessParameters()#
返回类型::

Unix进程参数

返回描述将应用于Unix系统子进程的额外标志和设置的UnixProcessParameters对象。默认设置对应于默认构造的UnixProcessParameters

注意

此函数仅在Unix平台上可用。

另请参阅

setUnixProcessParameters() childProcessModifier()

waitForFinished([msecs=30000])#
参数::

msecs – int

返回类型::

bool

阻塞直到进程已结束并已发出finished()信号,或者直到经过msecs毫秒。

如果进程已结束,则返回true;否则返回false(如果操作超时、发生错误或此QProcess已终止)。

此函数可以在没有事件循环的情况下运行。在编写非GUI应用程序和在非GUI线程中执行I/O操作时非常有用。

警告

从主(GUI)线程调用此函数可能会使您的用户界面冻结。

如果msecs为-1,则此函数不会超时。

另请参阅

finished() waitForStarted() waitForReadyRead() waitForBytesWritten()

waitForStarted([msecs=30000])#
参数::

msecs – int

返回类型::

bool

阻塞直到进程已启动并已发出started()信号,或者直到经过msecs毫秒。

如果进程成功启动,则返回true;否则返回false(如果操作超时或发生错误)。如果该函数在此函数之前已成功启动进程,则立即返回。

此函数可以在没有事件循环的情况下运行。在编写非GUI应用程序和在非GUI线程中执行I/O操作时非常有用。

警告

从主(GUI)线程调用此函数可能会使您的用户界面冻结。

如果msecs为-1,则此函数不会超时。

注意

在某些UNIX操作系统上,此函数可能返回true,但进程后续可能会报告一个FailedToStart错误。

另请参阅

started() waitForReadyRead() waitForBytesWritten() waitForFinished()

workingDirectory()#
返回类型::

str

如果QProcess已被分配了工作目录,此函数将返回在程序开始之前QProcess将进入的工作目录。否则(即没有分配目录),将返回空字符串,并且QProcess将使用应用程序的当前工作目录。

另请参阅

setWorkingDirectory()