PySide6.QtCore.QProcess

class QProcess

QProcess 类用于启动外部程序并与之通信。More_

PySide6.QtCore.QProcess 的继承图

概要

方法

插槽

信号

静态函数

注意

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

详细描述

警告

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

运行一个进程

要启动一个进程,请将您想要运行的程序名称和命令行参数作为参数传递给start()。参数以QStringList中的单独字符串形式提供。

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

例如,以下代码片段通过在参数列表中传递包含“-style”和“fusion”的字符串作为两个项目,在X11平台上以Fusion风格运行模拟时钟示例:

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 允许你将一个进程视为一个顺序的I/O设备。你可以像使用QTcpSocket访问网络连接一样,向进程写入和从进程读取数据。然后,你可以通过调用write()来写入进程的标准输入,并通过调用read()readLine()getChar()来读取标准输出。由于它继承了QIODeviceQProcess也可以用作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文档中概述的情况外,大多数情况下不需要“.exe”后缀。此外,QProcess会将Unix风格的正斜杠转换为Windows路径的反斜杠,以便用于程序名称。这使得使用QProcess的代码可以以跨平台的方式编写,如上例所示。

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

环境变量

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

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

正常场景从当前环境开始,通过调用systemEnvironment(),然后继续添加、更改或删除特定变量。然后可以将生成的变量列表应用于QProcess,使用setProcessEnvironment()

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

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

通过通道进行通信

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

通道的术语可能会引起误解。请注意,进程的输出通道对应于QProcess读取通道,而进程的输入通道对应于QProcess写入通道。这是因为我们使用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 管理正在运行的进程的输入。这是 QProcess 的默认输入通道模式。

QProcess.ForwardedInputChannel

QProcess 将主进程的输入转发到正在运行的进程。子进程从与主进程相同的源读取其标准输入。请注意,在子进程运行时,主进程不得尝试读取其标准输入。

另请参阅

setInputChannelMode()

class ExitStatus

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

常量

描述

QProcess.NormalExit

进程正常退出。

QProcess.CrashExit

进程崩溃了。

另请参阅

exitStatus()

class UnixProcessFlag

(继承自 enum.Flag) 这些标志可以用于 UnixProcessParametersflags 字段。

常量

描述

QProcess.UnixProcessFlag.CloseFileDescriptors

关闭所有高于lowestFileDescriptorToClose定义阈值的文件描述符,防止父进程中当前打开的描述符意外泄漏到子进程。stdinstdoutstderr文件描述符永远不会被关闭。

QProcess.UnixProcessFlag.CreateNewSession

通过调用setsid(2)启动一个新的进程会话。这允许子进程在当前进程所在的会话结束后继续存在。这是startDetached()采取的一个步骤,以允许进程分离,也是将一个进程守护化的步骤之一。

QProcess.UnixProcessFlag.DisconnectControllingTerminal

请求进程从其控制终端断开连接,如果它有的话。如果没有,则不会发生任何事情。如果终端关闭,仍然连接到控制终端的进程可能会收到挂断信号(SIGHUP),或者其他终端控制信号(SIGTSTPSIGTTINSIGTTOU)。请注意,在某些操作系统上,进程只有在它是会话领导者时才能从控制终端断开连接,这意味着可能需要CreateNewSession标志。像它一样,这是将进程守护化的步骤之一。

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信号处理程序重置为其默认状态(即传递SIG_DFLsignal(2))。此标志有助于确保任何被忽略的(SIG_IGN)信号不会影响子进程的行为。

QProcess.UnixProcessFlag.UseVFork

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

在版本6.6中添加。

__init__([parent=None])
Parameters:

父对象QObject

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

arguments()
Return type:

字符串列表

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

另请参阅

setArguments() start()

closeReadChannel(channel)
Parameters:

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()
Return type:

字符串列表

返回QProcess将传递给其子进程的环境,如果未使用setEnvironment()设置环境,则返回空的QStringList。如果未设置环境,则将使用调用进程的环境。

error()
Return type:

ProcessError

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

另请参阅

state()

errorOccurred(error)
Parameters:

错误ProcessError

当进程发生错误时,会发出此信号。指定的 error 描述了发生的错误类型。

static execute(program[, arguments={}])
Parameters:
  • program – str

  • arguments – 字符串列表

Return type:

整数

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

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

参数处理与相应的start()重载相同。

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

另请参阅

start()

exitCode()
Return type:

整数

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

除非exitStatus()返回NormalExit,否则此值无效。

exitStatus()
Return type:

ExitStatus

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

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

failChildProcessModifier(description[, error=0])
Parameters:
  • 描述 – str

  • error – int

此函数可以在修饰符集中使用setChildProcessModifier()来指示遇到错误情况。当修饰符调用这些函数时,QProcess将在父进程中发出errorOccurred(),并带有代码FailedToStartdescription可用于在errorString()中包含一些信息以帮助诊断问题,通常是失败的调用名称,类似于C库函数perror()。此外,error参数可以是错误代码,其文本形式也将被包含。

例如,子修饰符可以这样为子进程准备一个额外的文件描述符:

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

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

此函数不会返回到调用者。除了在子修饰符中使用以及使用正确的QProcess对象外,在其他任何地方使用它都是未定义的行为。

注意

实现中对description参数施加了长度限制,大约为500个字符。这不包括来自error代码的文本。

另请参阅

setChildProcessModifier() setUnixProcessParameters()

finished(exitCode[, exitStatus=QProcess.ExitStatus.NormalExit])
Parameters:

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

另请参阅

exitStatus()

inputChannelMode()
Return type:

InputChannelMode

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

kill()

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

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

另请参阅

terminate()

static nullDevice()
Return type:

字符串

操作系统的空设备。

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

processChannelMode()
Return type:

ProcessChannelMode

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

processEnvironment()
Return type:

QProcessEnvironment

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

另请参阅

setProcessEnvironment() inheritsFromParent() 环境 变量

processId()
Return type:

整数

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

program()
Return type:

字符串

返回进程最后启动时使用的程序。

另请参阅

setProgram() start()

readAllStandardError()
Return type:

QByteArray

无论当前读取通道如何,此函数都会从进程的标准错误中返回所有可用数据,作为QByteArray

readAllStandardOutput()
Return type:

QByteArray

无论当前读取通道如何,此函数都会从进程的标准输出中返回所有可用数据,作为QByteArray

readChannel()
Return type:

ProcessChannel

返回QProcess的当前读取通道。

另请参阅

setReadChannel()

readyReadStandardError()

当进程通过其标准错误通道(stderr)提供新数据时,会发出此信号。无论当前的read channel如何,都会发出此信号。

readyReadStandardOutput()

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

setArguments(arguments)
Parameters:

arguments – 字符串列表

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

setEnvironment(environment)
Parameters:

环境 – 字符串列表

警告

本节包含从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)
Parameters:

modeInputChannelMode

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

setProcessChannelMode(mode)
Parameters:

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)
Parameters:

环境QProcessEnvironment

警告

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

设置QProcess将传递给子进程的environment

例如,以下代码添加了环境变量 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)
Parameters:

状态ProcessState

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

另请参阅

state()

setProgram(program)
Parameters:

program – 字符串

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

如果 program 是一个绝对路径,它指定了将要启动的确切可执行文件。相对路径将以平台特定的方式解析,包括搜索 PATH 环境变量(详见 Finding the Executable)。

setReadChannel(channel)
Parameters:

channelProcessChannel

QProcess的当前读取通道设置为给定的channel。当前输入通道由函数read()readAll()readLine()getChar()使用。它还决定了哪个通道会触发QProcess发出readyRead()

另请参阅

readChannel()

setStandardErrorFile(fileName[, mode=QIODeviceBase.OpenModeFlag.Truncate])
Parameters:

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

有关文件如何打开的更多信息,请参见setStandardOutputFile()

注意:如果使用参数MergedChannels调用了setProcessChannelMode(),则此函数无效。

setStandardInputFile(fileName)
Parameters:

fileName – str

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

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

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

在进程启动后调用 setStandardInputFile() 没有效果。

setStandardOutputFile(fileName[, mode=QIODeviceBase.OpenModeFlag.Truncate])
Parameters:

将进程的标准输出重定向到文件fileName。当重定向生效时,标准输出读取通道将关闭:使用read()读取它将始终失败,readAllStandardOutput()也是如此。

要丢弃进程的所有标准输出,请在此处传递nullDevice()。这比从不读取标准输出更高效,因为不会填充任何QProcess缓冲区。

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

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

在进程启动后调用 setStandardOutputFile() 没有效果。

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

setStandardOutputProcess(destination)
Parameters:

目的地QProcess

警告

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

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

以下 shell 命令:

command1 | command2

可以使用QProcess通过以下代码完成:

process1 = QProcess()
process2 = QProcess()
process1.setStandardOutputProcess(process2)
process1.start("command1")
process2.start("command2")
setUnixProcessParameters(flagsOnly)
Parameters:

flagsOnlyUnixProcessFlag 的组合

这是一个重载函数。

在Unix系统上为子进程设置额外的设置为flagsOnly。这与仅设置flags字段的重载相同。

注意

此功能仅在Unix平台上可用。

另请参阅

unixProcessParameters() setChildProcessModifier()

setUnixProcessParameters(params)
Parameters:

paramsUnixProcessParameters

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

此函数可用于更改子进程的某些属性,例如关闭所有多余的文件描述符、更改子进程的优先级或与控制终端断开连接。如需对子进程进行更细粒度的控制或以其他方式修改它,请使用setChildProcessModifier()函数。如果同时设置了子进程修改器和Unix进程参数,则修改器将在应用这些参数之前运行。

注意

此功能仅在Unix平台上可用。

另请参阅

unixProcessParameters() setChildProcessModifier()

setWorkingDirectory(dir)
Parameters:

dir – str

将工作目录设置为dirQProcess将在此目录中启动进程。默认行为是在调用进程的工作目录中启动进程。

static splitCommand(command)
Parameters:

command – str

Return type:

字符串列表

将字符串 command 分割成一系列标记,并返回该列表。

带有空格的标记可以用双引号括起来;三个连续的双引号表示引号字符本身。

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

modeOpenModeFlag 的组合

这是一个重载函数。

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

另请参阅

open() setProgram() setArguments()

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

  • arguments – 字符串列表

  • modeOpenModeFlag 的组合

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

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

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

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

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

注意

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

另请参阅

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

startCommand(command[, mode=QIODeviceBase.OpenModeFlag.ReadWrite])
Parameters:

警告

本节包含从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([pid=None])
Parameters:

pidqint64

Return type:

布尔

启动由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)

static startDetached(program[, arguments={}[, workingDirectory=""]])
Parameters:
  • program – str

  • arguments – 字符串列表

  • workingDirectory – str

Return type:

(retval, pid)

此函数重载了 startDetached()

在新进程中启动程序 program 并使用参数 arguments,并与之分离。成功时返回 true;否则返回 false。如果调用进程退出,分离的进程将继续运行而不受影响。

参数处理与相应的start()重载相同。

该过程将在目录 workingDirectory 中启动。如果 workingDirectory 为空,则工作目录将从调用过程中继承。

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

另请参阅

start()

started()

当进程启动时,QProcess 会发出此信号,并且 state() 返回 Running

state()
Return type:

ProcessState

返回进程的当前状态。

另请参阅

stateChanged() error()

stateChanged(state)
Parameters:

状态ProcessState

每当QProcess的状态发生变化时,都会发出此信号。newState参数是QProcess改变后的状态。

static systemEnvironment()
Return type:

字符串列表

警告

本节包含从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()
Return type:

UnixProcessParameters

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

注意

此功能仅在Unix平台上可用。

另请参阅

setUnixProcessParameters() childProcessModifier()

waitForFinished([msecs=30000])
Parameters:

msecs – 整数

Return type:

布尔

阻塞直到进程完成并且finished()信号已发出,或者直到msecs毫秒过去。

如果进程完成,则返回true;否则返回false(如果操作超时、发生错误,或者此QProcess已经完成)。

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

警告

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

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

另请参阅

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

waitForStarted([msecs=30000])
Parameters:

msecs – 整数

Return type:

布尔

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

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

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

警告

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

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

另请参阅

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

workingDirectory()
Return type:

字符串

如果QProcess已被分配了一个工作目录,此函数将返回QProcess在程序启动前将进入的工作目录。否则(即未分配目录),将返回一个空字符串,QProcess将使用应用程序的当前工作目录。

另请参阅

setWorkingDirectory()

class UnixProcessParameters

在版本6.6中添加。

注意

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

详细描述

PySide6.QtCore.QProcess.UnixProcessParameters.flags
PySide6.QtCore.QProcess.UnixProcessParameters.lowestFileDescriptorToClose
PySide6.QtCore.QProcess.UnixProcessParameters._reserved